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)
SQL Server 2008以降では、DateTime
をDate
にキャストして、時間要素を削除できます。
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)
ここに私が見つけた最も簡単なものがあります
-- 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年にも適用されると思います。
--
-- 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
SELECT getdate()
結果:2012-12-14 16:03:33.360
SELECT convert(datetime,convert(bigint, getdate()))
結果2012-12-15 00:00:00.000
これを使ってみてください。
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
@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)
これは安く見えるかもしれませんが、それは私のために働いています
SELECT CONVERT(DATETIME、LEFT(CONVERT(VARCHAR、@ dateFieldOrVariable、101)、10)+ '00:00:00.000')
私は通常やる
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)
お役に立てれば
時間を切り捨てることができます。
以下のROUND
を使用すると、深夜に切り捨てられます。
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate > CONVERT(datetime, (ROUND(convert(float, getdate()-6.5),0)))