2012-05-11 9 views
2

私は前月の最初と最後の日を取得しようとしています。私が本当に必要とするのは、BETWEEN句の範囲です。そのため、最初の日の最初の秒と最後の日の最後の秒が必要です。前月の最初と最後の日付を取得する最も簡単で効率的な方法は何ですか?

これは私が使用してきたコードです:

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の4/30/2011の最後の1秒を取得したい。

私はグーグルであり、1か月の最初/最後の日にはさまざまな方法があります。 SOそのものであっても、私は多くの異なった答えでこの質問の多くの異なった変形を見る。私はこれを達成するためのすべてのメソッドのリストをコンパイルし、どれが "ベスト"であるかを判断したいと思います(簡略化と効率性に基づいて)

(私はSQL Server 2000を使用しています)

EDIT:ENDDATEバグ再

- このコードは実際には正しいが、問題は@endDateがsmalldatetime型だけだったということでした。日時に変更しました。これが正しく動作しています。

+0

Re:編集。これは、 '> = AND <' 'を使用してエラー、バグ、複雑さなどの範囲を減らす方法の例です。 – MatBailie

答えて

4

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

さまざまな精度を持つことができる連続値(離散値ではなく)を使用する場合は、通常は>= 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) 
+0

ありがとう、私はあなたのポイントを見ています...間違いなく"間 "はクリーナーです私が何をしようとしているのかを示しています)。しかし、私は精度がそれを上回っていると思う:)このコードを使用すると、 – froadie

+0

@froadieという回答を受け入れるでしょう - 私はBETWEENがもっときれいなコードのように感じることに同意します。また、離散値(BETWEEN 0と9など)には完璧です。残念ながら、それは連続値ではうまく動作しません。あなたは終わりの境界条件の*近似*をするように強制されます。 (誰が 'BETWEEN 0 AND 9.99999'を実行するのでしょうか?) – MatBailie

0

EDIT:@Demsからの説明どおり(コメントを参照してください)

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

このクエリを試すと、必要に応じて適切な日付が表示されます。

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

、あなたは直接下記@Demsでの提案に従って>= and <を使用することができ、この日付を使用しました。

+0

注:これは月の最終日ですが、朝は' 00:00'です。 The OPはその日の最後の「瞬間」を得るのに '-3ms'を使います。 – MatBailie

+0

はいデータを見つけるために '> = AND <='メソッドを使用すると、日付だけで管理しやすくなります。 – Murtaza

+0

私は '> = AND <='を提案しません。私は '> = AND <'を提案します。これにより、1日、3msなどを減算する必要がなくなります。 – MatBailie

関連する問題