Program Club

SQL DateTime을 자정으로 반올림

proclub 2020. 10. 28. 21:16
반응형

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)

이것은 반올림이 아닙니다. 이것은 잘립니다. 그러나 나는 그것이 요구되는 것이라고 생각합니다. (반올림하려면 하나를 추가하고 자르십시오 ... 그리고 그것은 또한 반올림이 아닙니다. 그 천장도 마찬가지지만 다시 한 번 원하는 것입니다. 실제로 반올림하려면 .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())

This might look cheap but it's working for me

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


I usually do

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

if you are using SQL SERVER 2008, you can do

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

Hope this helps


You could round down the time.

Using ROUND below will round it down to midnight.

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

참고URL : https://stackoverflow.com/questions/8555316/rounding-sql-datetime-to-midnight

반응형