함수를 사용하여 가장 가까운 분 및 가장 가까운 시간으로 반올림 된 T-SQL datetime


113

SQL Server 2008에서는 2008의 기존 함수를 사용하여 날짜 시간 열을 가장 가까운 시간과 가장 가까운 분으로 반올림하고 싶습니다.

이 열 값 2007-09-22 15:07:38.850의 경우 출력은 다음과 같습니다.

2007-09-22 15:08 -- nearest minute
2007-09-22 15    -- nearest hour

6
가장 가까운 분의 예는 15:08이 아니어야합니까? 1 분의 초가 60이기 때문에 ...
OMG Ponies

당신이 그 코멘트를 할 수 있도록 그의 질문을 편집 할 때 의도적으로 그 오류를 수정하지 않았습니까?
Mr 수요일

@MrWednesday 편집과 댓글 사이에 10 분 이상이 걸린다는 것을 알고 있습니다. 그 생각이 나중에 일어났다 고 생각합니다.
lc.

답변:


208
declare @dt datetime

set @dt = '09-22-2007 15:07:38.850'

select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)

돌아올 것이다

2007-09-22 15:07:00.000
2007-09-22 15:00:00.000

위는 초와 분을 잘라서 질문에서 요청한 결과를 생성합니다. @OMG Ponies가 지적했듯이 반올림 / 내림하려면 각각 30 분 또는 30 분을 더한 다음자를 수 있습니다.

select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)

그리고 당신은 얻을 것이다 :

2007-09-22 15:08:00.000
2007-09-22 15:00:00.000

SQL Server 2008에 날짜 데이터 형식이 추가 되기 전에는 위의 방법을 사용하여 datetime에서 시간 부분을 잘라서 날짜 만 가져 왔습니다. 아이디어는 문제의 datetime과 고정 된 시점 ( 0, 암시 적으로 캐스트 1900-01-01 00:00:00.000) 사이의 일 수를 결정하는 것입니다 .

declare @days int
set @days = datediff(day, 0, @dt)

그런 다음 해당 일 수를 고정 시점에 추가하면 시간이 다음과 같이 설정된 원래 날짜가 제공됩니다 00:00:00.000.

select dateadd(day, @days, 0)

또는 더 간결하게 :

select dateadd(day, datediff(day, 0, @dt), 0)

다른 날짜 부분 (예 : hour, mi)을 사용하면 그에 따라 작동합니다.


2
다른 사람이이 문제에 부딪 힐지는 의심 스럽지만 가장 가까운 초로 반올림하고 500 밀리 초를 추가하려면 datediff (second, '1/1/2000', .... vs datediff (초, 0 .... 당신은 오버플로 오류가 발생합니다 0에서 초는 너무 큰 I 추측이다..
에릭 Twilegar

'1900 년 1 월 1 일 이후의 시간을 1900 년 1 월 1 일에 추가하십시오.'— Java / SQL에서이 문제가 발생했습니다. 제 경우에는 실제로 Java 측에서 수행해야했습니다.
Corwin Newall

와 계산을 위해 datetimeoffset, 나는 대체했다 0으로 TODATETIMEOFFSET('1900-01-01 00:00:00', 0)방지 할 수있는 결과에 로컬 시간대를 강제.
krlmlr

26

귀하의 예에서와 같이 "반올림"합니다. 이것은 날짜의 varchar 값을 반환합니다.

DECLARE @date As DateTime2
SET @date = '2007-09-22 15:07:38.850'

SELECT CONVERT(VARCHAR(16), @date, 120) --2007-09-22 15:07
SELECT CONVERT(VARCHAR(13), @date, 120) --2007-09-22 15

varchar를 datetime으로 다시 변환합니다 (시간).CONVERT(datetime, CONVERT(VARCHAR(13), @date, 120)+':00:00')
Decula

10

나는이 질문이 오래된 것이고 받아 들여지고 또 다른 대답이 있다는 것을 알고 있습니다. 나는 또한 내 대답이 질문의 절반에 대해서만 답할 것이라는 것을 알고 있지만 가장 가까운 분으로 반올림하고 여전히 단일 함수 만 사용하는 datetime 호환 값을 갖고 싶은 사람에게는 다음 같습니다.

CAST(YourValueHere as smalldatetime);

몇 시간 또는 몇 초 동안 위의 Jeff Ogata의 답변 (허용 된 답변)을 사용합니다.


1
훌륭한 대답, 나는 그것이 잘리는 것이 아니라 둥글다는 것을 확인했습니다. 이 옵션을 찾는 다른 사람을 위해 smalldatetimeSQL 2008에 추가되었습니다.
BradC

시간 제한 만 필요한 테이블의 일부 데이터를 수정해야하는 경우 가장 좋은 옵션입니다.
암호화

-1

Select convert(char(8), DATEADD(MINUTE, DATEDIFF(MINUTE, 0, getdate), 0), 108) as Time

초를 00으로 내림합니다.


매우 느리고 OP가 요청한대로 반올림하지 않지만 반올림하여 요청하지 않았습니다. (면책 조항-나는 당신을 하향 투표하지 않았습니다)
Reversed Engineer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.