回答:
最速のレコードセットを反復処理する必要があるとSQL Server 2008で日付を持っていない場合
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
StackOverflowに関する2つの異なる優れた答えがこれを裏付けています。1つ、2つ
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)
編集:
決定論について述べたように、varcharメソッドは、スタイル112を使用しない限り安全ではありません。
ここでの他の回答は、これを列に適用することは決してないと指摘しています。これは正しいですが、10万行を選択するか、計算列またはGROUP BY日付のみを追加することができます。次に、このメソッドを使用する必要があります。
もう1つの答えは、スタイル110にも言及しています。これは、言語またはSET DATEFORMATに対して安全ではなく、「英国」の言語設定で失敗します。Tibor Karasziによるdatetimeデータ型の究極のガイドを参照してください。