0

私がやろうとしているのは、datetime 変数が過去 12 か月の任意の日付の値を持っているかどうかを確認することです。

DATEDIFF 関数を使用してみましたが、これには丸めの問題があることがすぐにわかりました (たとえば、12 月 31 日と 1 月 1 日を比較すると、1 日しか経過していないにもかかわらず、1 か月としてカウントされます)。

これをより正確にするために、-12 か月ではなく -365 日をパラメーターとして使用できますが、それでも閏年を考慮しないという問題が生じます (一般的なシナリオではありませんが、理想的には回避したいシナリオです!)

これについてどのように最善を尽くすことができるかについてのアイデアはありますか?

4

3 に答える 3

1

代わりにDATEADDを使用して、今日から 1 年を減算し、それを比較します

@datetimevariable >= DATEADD(year, -1, GETDATE())

注: 将来の日付がない限り、上限 (GETDATE()) を比較する必要はありません。

また、時分単位で正確に 1 年を指定しますか? そうでない場合は、 isまたはの場合にデータ型の優先順位が安全な this を使用します。これは WHERE 句などである必要があります@datetimevariabledatetimedatetime2

@datetimevariable >= CAST(DATEADD(year, -1, GETDATE()) as date)

これはうるう年でも機能します

SELECT DATEADD(YEAR, -1, '20120301'), DATEADD(YEAR, -1, '20120229')

2011-03-01 00:00:00.000
2011-02-28 00:00:00.000

DATEDIFF は特定の境界で機能します: 月の始まり、年の始まり、真夜中など。この場合は失敗します。

于 2013-04-23T08:45:41.113 に答える
1

うるう年の問題は、DATEADD (datepart , number , date ) 関数で解決できます。現在の日付からマイナス 1 年を指定できます。

where myDate between DATEADD (year , -1 , GETDATE() ) and GETDATE()
于 2013-04-23T08:47:38.727 に答える
0

DATEDIFF は、2 つの日付の間のパーティションの数をカウントします。丸めの問題はありません。あなたの最善の解決策は、おそらくDATEADDを使用することです

WHERE MyVal BETWEEN GETDATE() AND DATEADD(YEAR, -1, GETDATE())
于 2013-04-23T08:46:55.770 に答える