-1

ストアド プロシージャ コードでこのエラーが発生し、レコードの 1 つがうるう年の日付 2008-02-29 のものであることを発見しました。私が持っているコードでこれを回避するにはどうすればよいですか。コードは次のとおりです。

set @ContractDate = cast(cast(@Year as nvarchar(4))
+ '/' + cast(datepart(mm,@ContractDate) as nvarchar(2))
+ '/' + cast(datepart(dd,@ContractDate) as nvarchar(2)) as datetime)
4

3 に答える 3

2

最初に:

  • @Year と @ContractDate にはどのような値がありますか?
  • @ContractDate とはどのような形式/タイプですか?

us_englishこれはSQL Server 2012でうまくいくのでお願いします

SELECT cast('2008/02/29' as datetime)

ただし、変更するとSET DATEFORMAT、上記のコードを壊すことができます

-- breaks
SET DATEFORMAT DMY;
SELECT cast('2008/02/29' as datetime)

SET DATEFORMATに何を使用しても、 ISO日付形式を使用しても問題ありません

SET DATEFORMAT DMY;
SELECT cast('20080229' as datetime);
SET DATEFORMAT MDY;
SELECT cast('20080229' as datetime);
SET DATEFORMAT YDM;
SELECT cast('20080229' as datetime);

結論: ISO 以外の日付形式を使用しており、暗黙的な変換に依存しています

于 2013-02-20T15:21:16.680 に答える
0

日時/日付に変換する前に、文字列を ISO 形式 ( yyyymmdd) で取得することをお勧めします。カルチャ設定に関係なく、どのサーバーでも機能します。

@ContractDatedatetime/dateタイプであり、次@yearのようである場合2012/'2012'、次のように動作するはずです。実施例

Set @ContractDate = convert(datetime,
  convert(varchar(4),@year) + right(convert(varchar(8),@ContractDate,112),4))
于 2013-02-20T15:23:12.373 に答える