web-dev-qa-db-ja.com

SQL DateTimeを真夜中に丸める

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

私のスクリプト:

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

SQL Server 2008以降では、DateTimeDateにキャストして、時間要素を削除できます。

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)
101
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つを丸めて切り捨てます...そして、それは天井を丸めることではありませんが、おそらくあなたが望むものです。

GetDate()に.5を追加すると、期待どおりに機能することがわかりました。

-- Round Current time to midnight today or midnight tomorrow

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

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

46
Darrel Lee
--
-- 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
edvox1138
SELECT getdate()

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

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

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

4
Jeremy Atkinson

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

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
3
UttamG

@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
MatBailie

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

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
Bassam Mehanni

時間を切り捨てることができます。

以下のROUNDを使用すると、深夜に切り捨てられます。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >  CONVERT(datetime, (ROUND(convert(float, getdate()-6.5),0)))
0
ChrisM