0

私のストアド プロシージャは 1 つのパラメーターを受け入れ、それは日時です。パラメータが渡されない場合は、デフォルトでgetdate()関数に設定します。

ALTER PROCEDURE [dbo].[myexport]
(
    @start datetime = null
)
AS 
BEGIN
    SET NOCOUNT ON;
    set @start = isnull(@start, getdate())

パラメータを指定せずにストアド プロシージャを実行すると、正しい結果が得られます。日付パラメーターを渡すと、次のエラーが発生します。

exec myexport '2013-04-22 00:00:00:00'

Msg 245, Level 16, State 1, Procedure myexport, line 16
Conversion failed when converting the varchar value '(-) 0mms' to data type int.

これが私の @start date のコンテキストです:

select
    count(distinct pid),
    'Inpatient Hosp'
from
    form_names fn
        inner join form_items fi on fn.id = fi.form_name
        inner join form_records fr on fn.id = fr.form_name
        left outer join form_answers fa on fi.id = fa.form_item and fa.form_record = fr.id
where
    fn.name like '%Transfer of Health Information%'
    and dateadd(dd, 0, datediff(dd, 0, fr.date)) = dateadd(dd, 0, datediff(dd, 0, @start))
    and fi.text like '%date of return%'
    and fa.id is NULL

編集 -

私のストアド プロシージャ ID はかなり大きく、多くのサブ クエリがありますが、問題のあるクエリを見つけたと思います。

select
    count(*),
    'PPD +'
from
    form_records fr
        inner join form_names fn on fn.id = fr.form_Name
        inner join form_items fi on fn.id = fi.form_name
        inner join form_answers fa on fr.id = fa.form_record
            and fa.form_item = fi.id
where
    fn.id = 3
    and fa.form_item = 30
    and fa.text not like '%neg%'
    and dateadd(dd, 0, datediff(dd, 0, fa.entered_date)) = dateadd(dd, 0, datediff(dd, 0, @start))
    and CAST(fa.text AS INT) >= 10

でこのクエリを手動で実行するとgetdate()結果は正しいのですが、で実行すると'2013-04-22 00:00:'00エラーが発生します。

のデータ型fa.entered_datedatetime.

どんな助けでも大歓迎です。

4

3 に答える 3

1

最後のクエリで何をしようとしているのかわかりません。ただし、構文は

DATEADD (datepart , number , date )

あなたが持っている

dateadd(dd, 0, datediff(dd, 0, @start))

DATEDIFF はINTを返します

クエリを変更する必要があります

于 2013-04-29T14:50:58.617 に答える
1

明確な形式を使用して日付を指定すると、ここで役立つ場合があります。使用例

'20130422'

また

'2013-04-22T10:57:33.007'

それ以外のものはあいまいさに陥る可能性があります。たとえば、状況によっては、SQL Server は2013-04-22or2013-04-22 10:57:33.007を 22 か月の 4 日からの日付として解釈し、変換に失敗します。


また、クエリについては、次のように実行します。

and fr.date> = @start and fr.date < DATEADD(day,1,@start)

@startクエリを実行する前に設定した:

set @start = DATEADD(day,DATEDIFF(day,0,@start),0)

これは、 を含むインデックスがあればfr.date、少なくともそのインデックスを使用できる可能性があることを意味します。

于 2013-04-29T14:51:56.437 に答える