SQL 쿼리에 작은 문제가 있습니다. GETDATE 함수를 사용하고 있지만 오후 5시에 스크립트를 실행한다고 가정하면 2011 년 12 월 12 일 오후 5 시부 터 2011 년 12 월 18 일 오후 5시 사이에 레코드를 가져옵니다. 어떻게하면 전체 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을 더하고 자르십시오 … 그리고 그것은 또한 반올림이 아닙니다. 그 천장을 반올림하지만 다시 한 번 당신이 원하는 것입니다. 정말로 반올림하려면 .5를 더하고 (작동합니까?) 자르십시오.
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
답변
@BassamMehanni가 언급했듯이 SQL Server 2008부터 DATE로 캐스팅 할 수 있습니다.
SELECT
*
FROM
yourTable
WHERE
dateField >= CAST(GetDate() - 6 AS DATE)
AND dateField < CAST(GetDate() + 1 AS DATE)
두 번째 조건은 실제로 그냥 GetDate()
일 수 있지만 Less Than DateX
dateField를 DATE로 캐스팅하지 않아도되므로 성능이 크게 향상되는 것을 방지하기 위한 예로이 형식을 보여줍니다 .
2005 년 이하라면 이것을 사용할 수 있습니다 …
SELECT
*
FROM
yourTable
WHERE
dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0)
AND dateField < DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)
답변
이것을 사용해보십시오.
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
답변
이것은 싸게 보일지 모르지만 그것은 나를 위해 일합니다
SELECT CONVERT (DATETIME, LEFT (CONVERT (VARCHAR, @ dateFieldOrVariable, 101), 10) + ’00 : 00 : 00.000′)