[sql] SQL DateTime을 자정으로 반올림

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 DateXdateField를 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′)