[sql] SQL Server에서 두 날짜 시간의 차이
datetime
SQL Server에서 두 가지 차이점을 취하는 방법이 있습니까?
예를 들어, 내 날짜는
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
따라서 결과는 14.063 seconds
.
답변
DateDiff에 대해 추가 할주의 사항은 단위로 지정한 경계를 통과 한 횟수를 계산하므로 정확한 시간 범위를 찾는 경우 문제가 발생할 수 있습니다. 예 :
select datediff (m, '20100131', '20100201')
1 월에서 2 월까지 경계를 넘었 기 때문에 1의 답을 제공합니다. 따라서 범위가 2 일이더라도 datediff는 1의 값을 반환합니다. 1 개의 날짜 경계를 넘었습니다.
select datediff(mi, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')
1의 값을 다시 부여하면 분 경계를 한 번 통과 했으므로 약 14 초이지만 Minutes를 단위로 사용하면 1 분으로 반환됩니다.
답변
답변
SELECT DATEDIFF(day, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')
day
차이를 얻고 싶은 다른 단위 (예 second
: minute
등)로 교체하십시오 .
답변
매우 유용 할 수있는 MS SQL Server의 네 가지 중요한 기능을 언급 할 수 있습니다.
1) DATEDIFF () 함수 는 두 날짜 간의 차이를 계산합니다. 결과 는 첫 번째 매개 변수 ( datepart ) 에 지정된 ” 년 분기 월 요일 요일 주시 분 초 밀리 초 마이크로 초 나노초 “일 수 있습니다.
select datediff(day,'1997-10-07','2011-09-11')
2) GETDATE () 함수를 사용하여 실제 시간을 얻고 일부 날짜와 실제 날짜의 차이를 계산할 수 있습니다.
select datediff(day,'1997-10-07', getdate() )
3) 또 다른 중요한 함수는 DATEADD () 이며, datediff 의 동일한 datepart 를 사용하여 datetime의 일부 값을 변환하는 데 사용 되며 하나의 기본 날짜에 더하거나 (양수 값 사용) 빼거나 (음수 값 사용) 할 수 있습니다.
select DATEADD(day, 45, getdate()) -- actual datetime adding 45 days
select DATEADD( s,-638, getdate()) -- actual datetime subtracting 10 minutes and 38 seconds
4) CONVERT () 함수 는 필요에 따라 날짜 형식을 지정하도록 만들어졌지만 매개 변수 함수는 아니지만 결과의 일부를 사용하여 필요한대로 결과 형식을 지정할 수 있습니다.
select convert( char(8), getdate() , 8) -- part hh:mm:ss of actual datetime
select convert( varchar, getdate() , 112) -- yyyymmdd
select convert( char(10), getdate() , 20) -- yyyy-mm-dd limited by 10 characters
DATETIME 콜드 (cold)는 초 단위로 계산되며이 네 가지 함수를 혼합 한 흥미로운 결과 는 두 날짜 사이 의 형식화 된 차이 um시, 분 및 초 ( hh : mm : ss )를 표시하는 것입니다.
declare @date1 datetime, @date2 datetime
set @date1=DATEADD(s,-638,getdate())
set @date2=GETDATE()
select convert(char(8),dateadd(s,datediff(s,@date1,@date2),'1900-1-1'),8)
… 결과는 00:10:38입니다 (638s = 600s + 38s = 10 분 38 초).
또 다른 예:
select distinct convert(char(8),dateadd(s,datediff(s, CRDATE , GETDATE() ),'1900-1-1'),8) from sysobjects order by 1
답변
나는 이런 식으로 시도했고 효과가 있었다. SQL Server 버전 2016을 사용했습니다.
SELECT DATEDIFF(MILLISECOND,'2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')/1000.00;
다른 DATEDIFF 기능은 다음과 같습니다.
SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
참조 : https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017
답변
좋아요, 우리 모두는 대답이 포함된다는 것을 압니다 DATEDIFF()
. 그러나 그것은 당신이 원하는 결과의 절반만을 제공합니다. 두 DATETIME
값 사이의 분과 초로 사람이 읽을 수있는 형식으로 결과를 얻으려면 어떻게해야 합니까?
그만큼 CONVERT()
, DATEADD()
물론 DATEDIFF()
기능은 클라이언트가 숫자 대신 사용할 수있는 더 쉽게 읽을 수있는 결과를 위해 완벽하다.
즉
CONVERT(varchar(5), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114)
이것은 당신에게 다음과 같은 것을 줄 것입니다.
HH : MM
더 많은 정밀도를 원하면 VARCHAR()
.
CONVERT(varchar(12), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114)
HH : MM.SS.MS
답변
SQL Server에서 내부적으로 날짜는 2 개의 정수로 저장됩니다. 첫 번째 정수는 기준 날짜 (1900/01/01) 전후의 날짜 수입니다. 두 번째 정수는 자정 이후의 클록 틱 수를 저장하며 각 틱은 1/300 초입니다.
이 때문에 날짜를 비교하는 가장 간단한 방법은 단순히 날짜를 빼는 것입니다. 이것은 내 사용 사례의 90 %를 처리합니다. 예 :
select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...
일 이외의 단위로 답변이 필요한 경우 DateDiff 를 사용 합니다.