2

前月の最初と最後の日を取得しようとしています。本当に必要なのはBETWEEN句の範囲なので、初日の最初の1秒と、最後の日の最後の1秒が必要です。

これは私が使用しているコードです:

set @startDate = DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm, -1, getdate())), 0)
set @endDate = dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()  ), 0))

ただし、今日の場合、これは実際には2011年4月1日と2011年5月1日を返しますが、これは完全には正確ではありません。endDateの2011年4月30日の最後の1秒を取得したいと思います。

私はグーグルをしていて、月の最初/最後の日を取得するためのさまざまな方法を見ています。SO自体でも、この質問にはさまざまなバリエーションがあり、さまざまな答えがあります。これを達成するためのすべての方法のリストをまとめてから、どれが「最良」であるかを判断したいと思います(単純さと効率に基づいて)

(SQL Server 2000を使用していることを追加する必要があります)

編集:

終了日のバグについて-このコードは実際には正しいですが、問題はそれが小さな日付で@endDateあったことだけでした。日時に変更しましたが、正常に動作しています

4

2 に答える 2

4

日付については、使用しないことを強くお勧めしBETWEENます。これは、「前日の最後の瞬間」を取得するために日付から 3 ミリ秒を削除する必要があることによって強調されます。

さまざまな精度を持つ可能性がある (離散値ではなく) 連続値の場合、一般的には を使用することをお勧めします>= AND <。例えば...

WHERE myDateField >= '2012-04-01' AND myDateField < '2012-05-01'

これを行うことで、myDateFieldデータやデータ型の精度について考える必要さえありません。それだけで機能します。いつも。


それを念頭に置いて、あなたのコードは私が使用するものに非常に近いです...

SET @start = DATEADD(month, DATEDIFF(month, 0, getDate()) - 1, 0)
SET @end   = DATEADD(month, DATEDIFF(month, 0, getDate())    , 0)
于 2012-05-11T11:21:28.447 に答える
0

編集:@Demsからの説明に従って(コメントを参照してください)

私の答えは@Demsと同じになると思います。両方とも同じ答えです。:) @Dems クレジットはあなたのものです。

このクエリを試してみると、必要に応じて適切な日付が得られます。

select DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm, -1, GETDATE())), 0)
select DATEADD(mm, DATEDIFF(mm,0,GETDATE()  ), 0)

>= and <この日付を使用すると、以下の@Demsによる提案に従って直接使用できます。

于 2012-05-11T11:21:33.803 に答える