0

日付から 18 か月を減算する際に奇妙な問題があります。次のスニペットを検討してください。

Convert(dateTime,CREATION_DATE,103) > 
    DateAdd (MONTH, -18, Convert (DateTime, @IN_ACTIVITY_DATE, 103))

これは、ストアド プロシージャの where 句の一部を形成します。私が実行すると:

exec theSP @IN_ACTIVITY_DATE = '21/02/2013'

正常に動作しますが、これに変更すると:

exec theSP @IN_ACTIVITY_DATE = '21/01/2013'

エラーで壊れます:

varchar データ型を datetime データ型に変換すると、範囲外の値になりました。

私のコードを壊しているのが1月(他のすべての月は問題ありません)である理由について誰か考えがありますか?

ありがとう。

DS

4

3 に答える 3

2

文字列を日時として渡すには、カルチャ情報を持つサーバーで動作することが保証されているISO formatas which を使用します。yyyymmdd

exec theSP @IN_ACTIVITY_DATE = '20130121'

また、補足として、 すでにある場合CREATION_DATEは、比較datetimeする必要はありません。CONVERT CREATION_DATE

--if CREATION_DATE is DATETIME/DATE column
CREATION_DATE > 
DateAdd (MONTH, -18, Convert (DateTime, @IN_ACTIVITY_DATE))
于 2013-02-11T14:11:15.667 に答える
0

YYYY-MM-DD形式で日付を指定します。

例えば。:

exec theSP @IN_ACTIVITY_DATE = '2013-01-21'

また、SET DATEFORMATを使用して日付形式を指定することもできます。

例えば。:

SET DATEFORMAT dmy;
exec theSP @IN_ACTIVITY_DATE = '21/02/2013'
exec theSP @IN_ACTIVITY_DATE = '21/01/2013'

SET DATEFORMAT: date、smalldatetime、datetime、datetime2、および datetimeoffset 文字列を解釈するための月、日、および年の日付部分の順序を設定します。

SET DATEFORMAT { format | @format_var } 

フォーマット | @format_var: 日付部分の順序です。有効なパラメーターは、mdy、dmy、ymd、ydm、myd、および dymです。

于 2013-02-11T14:18:38.967 に答える
0

check constraintデータベースには、1 月の日付が気に入らないもの(おそらく ) がある可能性があります。への変換は、SQL Server 2008 ( Fiddle ) で機能するようです。他の何かが問題を引き起こしている可能性があります。

また、他の人が提供する日付形式の提案は良いアドバイスです。

于 2013-02-11T14:28:07.867 に答える