programing

SQL 날짜를 자정으로 반올림

muds 2023. 5. 21. 12:01
반응형

SQL 날짜를 자정으로 반올림

SQL 쿼리에 작은 문제가 있습니다.저는 GETDATE 기능을 사용하고 있지만, 스크립트를 오후 5시에 실행한다고 가정하면 12/12/2011 5시에서 12/18/2011 5시 사이의 레코드가 올라갑니다.어떻게 하면 12/12/2011 - 12/18/2011 전체에 대한 기록을 가져올 수 있습니까? 기본적으로 시간을 무시합니다.

내 대본:

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()))

DATEIFF는 1900-1-1 이전 또는 이후의 정수 일 수를 반환하고, 변환 날짜 시간은 자정에 해당 날짜로 반환합니다.

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 

날짜 시간을 날짜로 변환한 다음 다시 날짜 시간으로 변환할 수 있습니다.타임스탬프가 재설정됩니다.

getdate 선택() --2020-05-05 13:53:35.863
출연진 선택(출연진(GETDATE())을 날짜 시간으로 선택) --2020-05-05:00:00.000
SELECT getdate()

결과: 2012-12-14 16:03:33.360

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

결과 2012-12-1500:00.000

@Bassam Mehanni가 언급했듯이 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를 날짜로 캐스트하지 않아도 되므로 성능이 크게 향상됩니다.


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())

이것은 저렴해 보일 수 있지만 저에게는 효과가 있습니다.

변환 선택(DATTIME,LEFT(변환(VARCHAR,@dateFieldOrVariable,101)+' 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)))

안녕하세요. 아래 쿼리를 사용해 보십시오.

select * from table where column_name <=(cast(GETDATE() as date)) and column_name >=(cast(GETDATE()-1 as date))

언급URL : https://stackoverflow.com/questions/8555316/rounding-sql-datetime-to-midnight

반응형