web-dev-qa-db-ja.com

時間部分なしで現在の日付を取得する方法

SQL Server 2005では、時刻部分なしで現在の日付を取得するにはどうすればよいですか?私はGETDATE()を使用していますが、00:00:00.0の時間にしたいと考えています

88
Piers Myers

fastestレコードセットを反復処理する必要があり、SQL Server 2008に日付がない場合

_SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
_

StackOverflowに関する2つの異なる優れた答えがこれを裏付けています: OneTwo

Varchar変換は、それを行うための最悪の方法の1つです。もちろん、1つの値については重要ではないかもしれませんが、それを理解するのは良い習慣です。

この方法は、計算列にインデックスを付ける場合など、確定的です。 SQL Serverについての本を書いている人でも 日時変換で追い出されます

この手法も拡張可能です。

  • 昨日:DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1)
  • 月の初め:DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
  • 先月末:DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)
  • 来月の初め:DATEADD(month, DATEDIFF(month, 0, GETDATE()), 31)

編集:

決定論について述べたように、スタイル112を使用しない限り、varcharメソッドは安全ではありません。

ここでの他の回答は、これを列に適用しないことを指摘しています。これは正しいですが、10万行を選択するか、計算列またはGROUP BY日付のみを追加することもできます。次に、このメソッドを使用する必要があります。

もう1つの回答ではスタイル110についても言及しています。これは言語またはSET DATEFORMATの安全ではなく、「イギリス」の言語設定では失敗します。 日時データ型の最終的なガイドを参照 Tibor Karaszi著。

125
gbn

これを、フォーマットパターン(この場合は110)を指定してvarcharに変換し、次に変換(またはキャスト)して日時に戻す必要があります。

select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)
6
mrdenny