SQL DateTimeを真夜中に丸める

私は私のSQLクエリに小さな問題があります。私はGETDATE関数を使用していますが、私は5PMでスクリプトを実行すると、12/12/2011 5PMから12/18/2011 5PMの間にレコードをプルアップします。どのようにすれば、全体のレコードをプルアップすることができますか?12/12/2011 - 12/18/2011は基本的に時間を無視します。

私のスクリプト:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate > (GETDATE()-6)  
63

8 答え

SQL Server 2008以降では、 DateTime Date にキャストして、time要素を削除することができます。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= (cast(GETDATE()-6 as date))  

SQL Server 2005およびそれ以下では、以下を使用できます。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= DateAdd(Day, Datediff(Day,0, GetDate() -6), 0)
86
追加された
私はこのタイプの日付が定義されたシステムタイプではありません。
追加された 著者 henryaaron,
誰が信用を得るべきか疑問に思います...;)
追加された 著者 henryaaron,
それは、不正な構文が "、"
追加された 著者 henryaaron,
申し訳ありません@Dems Daveさんの見た目はあまり複雑ではありません
追加された 著者 henryaaron,
Nevermindはそれを分かった、ありがとう。
追加された 著者 henryaaron,
私は@Demsから盗んだ
追加された 著者 henryaaron,
@DaveShaw - 真夜中に何らかの形で発生する日付値の> > = に変更する必要があります。
追加された 著者 MatBailie,
@ user1090389 - LOL の唯一の違いは、WHERE条件にデモンストレーション >と上の境界。 ANDラインを削除するとほぼ同じです;)
追加された 著者 MatBailie,
@DaveShaw - そこにDATEADDがありません
追加された 著者 MatBailie,
@DaveShaw - 週の半ばはコピー&ペーストできません;)
追加された 著者 MatBailie,
@ user1090389その理由は、私は文字列の変換オプションを置く; D
追加された 著者 Bassam Mehanni,
@ user1090389私はいくつかのコードがありませんでした。更新しました。
追加された 著者 DaveShaw,
@Demsだから私は、それは日曜日の夜です、私はコピーして貼り付けすることもできません:o
追加された 著者 DaveShaw,
SQL 2008以外のコードで私の答えを更新しました
追加された 著者 DaveShaw,
私はあなたがSQL 2008を使用していないと思う:)
追加された 著者 DaveShaw,
@Demsあなたが正しいです。私は "user"という掲示板からC&Pして、 "Scripts"フォルダ(Popfly)からC&P'dしました。
追加された 著者 DaveShaw,

ここで私が見つけた最も簡単なことがあります

-- Midnight floor of current date

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))

DATEDIFFは、1900-1-1の前または後の整数の日数を返します。 Convert Datetimeは義務的にそれを真夜中にその日付に戻します。

DateDiffは整数を返しますので、右のオフセットを得るために日の加算または減算を使用できます。

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)

これは四捨五入されていません...これは切り捨てです...しかし、私はそれが尋ねられているものだと思います。 (1つを丸めて切り捨てるには丸めもしませんが、それは天井ですが もう一度あなたがしたいと思う可能性が高いです。本当に四捨五入するには.5(それは動作しますか?)を切り捨ててください。

.5をGetDate()に追加することができ、期待どおりに動作することが判明しました。

-- Round Current time to midnight today or midnight tomorrow

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))

私はSQL Server 2008ですべての試行を行いましたが、これらの機能は2005年にも適用されると思います。

40
追加された
--
-- SQL DATEDIFF getting midnight time parts 
--
SELECT GETDATE() AS Now, 
   Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) AS MidnightToday,
   Convert(DateTime, DATEDIFF(DAY, -1, GETDATE())) AS MidnightNextDay,
   Convert(DateTime, DATEDIFF(DAY, 1, GETDATE())) AS MidnightYesterDay
go
Now                   MidnightToday          MidnightNextDay        MidnightYesterDay     
 --------------------  ---------------------  ---------------------  --------------------- 
 8/27/2014 4:30:22 PM  8/27/2014 12:00:00 AM  8/28/2014 12:00:00 AM  8/26/2014 12:00:00 AM 
7
追加された
SELECT getdate()

結果:2012-12-14 16:03:33.360

SELECT convert(datetime,convert(bigint, getdate()))

結果2012-12-15 00:00:00.000

4
追加された
答えを説明し、コードを書式設定してみてください。
追加された 著者 JSuar,
フィードバックをお寄せいただきありがとうございます。私がbigintとbackへの変換があなたのための丸めを行うことを強調しようとしていたこと。
追加された 著者 Jeremy Atkinson,

@BassamMehanniが言及したように、あなたはSQL Server 2008以降でDATEとしてキャストすることができます...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= CAST(GetDate() - 6 AS DATE)
  AND dateField <  CAST(GetDate() + 1 AS DATE)

2番目の条件は実際には GetDate()だけですが、dateFieldをDATEにキャストしないようにするために、この形式を Less Than DateX パフォーマンスを大幅に向上させます。


あなたが2005年にいるなら、これを使うことができます...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0)
  AND dateField <  DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)
3
追加された

これを使ってみてください。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
3
追加された

これは安く見えるかもしれませんが、私のために働いています

SELECT CONVERT(DATETIME、LEFT(CONVERT(VARCHAR、@ dateFieldOrVariable、101)、10)+ '00:00:00.000')

1
追加された

私は通常やる

SELECT *
FROM MyTable
WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)

SQL Server 2008を使用している場合は、行うことができます

SELECT *
FROM MyTable
WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)

お役に立てれば

0
追加された
@Demsはい、例が分かると思います...
追加された 著者 henryaaron,
最初の例を使用する場合、オプティマイザがインデックスなどを使用する能力を destory する場合は、Date関数の演算と比較を行うためにString関数を使用することは非常に悪い考えです。それは決して言及すべきではありません、それはその貧しいオプションです。
追加された 著者 MatBailie,
SQL Server 2008を使用している必要はありません。それ以外の場合は、SQL Server 2000/2005で他にどのように実行できるかわかりません。
追加された 著者 Bassam Mehanni,
公平であるために。どちらのオプションもoptmizerのインデックス使用能力を破壊します。フィルター述部列を実行し、機能を実行する必要があります。これにはキャストが含まれます。
追加された 著者 pimbrouwers,