SQL 서버의 두 날짜 시간 차이입니다.
두 가지 차이점을 취할 수 있는 방법이 있을까요?datetime
sql 서버에 있습니까?
예를 들어, 제 데이트 상대는요.
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
따라서 결과는 다음과 같습니다.14.063 seconds
요.
DateDiff에 대한 주의 사항만 추가하면 단위로 지정한 경계를 통과하는 횟수가 계산되므로 정확한 시간 범위를 찾는 경우 다음과 같은 문제가 발생할 수 있습니다.
select datediff (m, '20100131', '20100201')
1의 답변은 1월부터 2월까지 경계를 넘었기 때문에 dateiff는 2일 동안이지만 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 (MyUnits, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')
MSDN의 DATIFF를 기반으로 "MyUnits"를 대체합니다.
SELECT DATEDIFF(day, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')
체하다다를 바꿉니다.day
차분을 구하고자 하는 다른 단위들과 함께, 예를 들어 '차분을 구하고자 하는 단위가 있습니다.second
, , 입니다.minute
매우 유용할 수 있는 MS SQL Server의 4가지 중요한 기능을 언급할 수 있습니다.
1) DATIFF() 함수는 두 날짜 간의 차이를 계산하며, 결과는 첫 번째 매개 변수(날짜 부분)에 지정된 "year 1/4 month day of year day of year week hour minute millisecond microsecond nanosecond"가 될 수 있습니다.
select datediff(day,'1997-10-07','2011-09-11')
2) GETDATE() 함수를 사용하여 실제 시간을 얻고 일부 날짜와 실제 날짜의 차이를 계산할 수 있습니다.
select datediff(day,'1997-10-07', getdate() )
3) 또 다른 중요한 함수는 DATEADD()입니다. DATEADD()는 DATEFF의 동일한 날짜 부분을 사용하여 날짜/시간 내의 일부 값을 변환하는 데 사용됩니다. 이 함수는 하나의 기준 날짜에 (양수 값으로) 또는 부분 추출(음수 값으로)할 수 있습니다.
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 콜드는 초 단위로 계산되며, 이 네 가지 함수를 혼합한 한 가지 흥미로운 결과는 두 날짜 사이의 시간, 분 및 초(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;
다양한 DATIFF 기능은 다음과 같습니다.
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://learn.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017
요, 여러분 모두 정답은 아, ,, 우, 우, 우, 우, 우, 우, 우, 우, 우, the, the, the, the, the, know, the, the, the,DATEDIFF()
하지만 그렇게 되면 원하는 결과의 절반만 얻을 수 있습니다.사람이 읽을 수 있는 형식으로 를 얻으려면 두 시간 사이의 분(Minutes and Seconds)을 으로 해야 합니다.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요씨
날짜 차이를 확인하는 방법에는 여러 가지가 있으며, 날짜/시간을 비교할 때 더 많은 방법이 있습니다.다음은 두 날짜의 형식을 구분하는 데 사용하는 방법입니다.HH:MM:SS"를 선택합니다.
ElapsedTime AS
RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 60 AS VARCHAR(2)), 2)
계산된 열에 사용했지만 UDF 또는 쿼리 계산으로 다시 작성할 수 있습니다.이 로직은 소수 초를 반올림합니다. 00:00.00 ~ 00:00.999는 0초로 간주되며 "00:00:00"로 표시됩니다.
기간이 며칠 이상 걸릴 것으로 예상되면 이 코드는 D:로 전환됩니다.필요한 경우 HH:MM:SS 형식을 사용합니다.
ElapsedTime AS
CASE WHEN DATEDIFF(S, StartDate, EndDate) >= 359999
THEN
CAST(DATEDIFF(S, StartDate, EndDate) / 86400 AS VARCHAR(7)) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 86400 / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 60 AS VARCHAR(2)), 2)
ELSE
RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 60 AS VARCHAR(2)), 2)
END
다음 쿼리는 당신이 찾고 있는 것과 정확히 일치해야 합니다.
select datediff(second, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')
여기 MSDN의 링크가 있습니다. 당신이 dateiff 함수로 할 수 있는 모든 것을 위한. https://msdn.microsoft.com/en-us/library/ms189794.aspx
SQL Server의 날짜는 내부적으로 2개의 정수로 저장됩니다.첫 번째 정수는 기준 날짜(1900/01/01) 전후의 일 수입니다.두 번째 정수는 자정 이후의 클럭 틱 수를 저장합니다. 각 틱은 1/300초입니다.
이것 때문에, 저는 종종 날짜를 비교하는 가장 간단한 방법을 단순히 추출하는 것을 발견합니다.이렇게 하면 사용 사례의 90%가 처리됩니다.예.,
select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...
일 단위 이외의 단위가 필요한 경우 DateDiff를 사용합니다.
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff
1년 중 두 날짜를 구분해 줍니다.
여기서(2017-2011)=6입니다.
구문은 다음과 같습니다.
DATEDIFF(interval, date1, date2)
이렇게 하다에 사용합니다.DD:MM:SS
다음을 참조하십시오
SELECT CONVERT(VARCHAR(max), Datediff(dd, '2019-08-14 03:16:51.360',
'2019-08-15 05:45:37.610'))
+ ':'
+ CONVERT(CHAR(8), Dateadd(s, Datediff(s, '2019-08-14 03:16:51.360',
'2019-08-15 05:45:37.610'), '1900-1-1'), 8)
그래서 이게 제 답은 아니고 인터넷에서 이런 질문을 검색하다가 이걸 발견했어요.범인은 시간, 분, 초를 계산하는 절차를 세웠어요링크 및 코드는 다음과 같습니다.
--Creating Function
If OBJECT_ID('UFN_HourMinuteSecond') Is Not Null
Drop Function dbo.UFN_HourMinuteSecond
Go
Exec(
'Create Function dbo.UFN_HourMinuteSecond
(
@StartDateTime DateTime,
@EndDateTime DateTime
) Returns Varchar(10)
As
Begin
Declare @Seconds Int,
@Minute Int,
@Hour Int,
@Elapsed Varchar(10)
Select @Seconds = ABS(DateDiff(SECOND ,@StartDateTime,@EndDateTime))
If @Seconds >= 60
Begin
select @Minute = @Seconds/60
select @Seconds = @Seconds%60
If @Minute >= 60
begin
select @hour = @Minute/60
select @Minute = @Minute%60
end
Else
Goto Final
End
Final:
Select @Hour = Isnull(@Hour,0), @Minute = IsNull(@Minute,0), @Seconds = IsNull(@Seconds,0)
select @Elapsed = Cast(@Hour as Varchar) + '':'' + Cast(@Minute as Varchar) + '':'' + Cast(@Seconds as Varchar)
Return (@Elapsed)
End'
)
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'
select CAST((@dt2-@dt1) as time(0))
인쇄 날짜(초, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')
select
datediff(millisecond,'2010-01-22 15:29:55.090','2010-01-22 15:30:09.153') / 1000.0 as Secs
result:
Secs
14.063
그냥 얘기하려고 했어요.
솔-1: 다음을 수행합니다.
select
StartTime
, EndTime
, CONVERT(NVARCHAR,(EndTime-StartTime), 108) as TimeDiff
from
[YourTable]
솔-2: 다음을 수행합니다.
select
StartTime
, EndTime
, DATEDIFF(hh, StartTime, EndTime)
, DATEDIFF(mi, StartTime, EndTime) % 60
from
[YourTable]
솔 3: 다음과 같습니다.
select
DATEPART(hour,[EndTime]-[StartTime])
, DATEPART(minute,[EndTime]-[StartTime])
from
[YourTable]
Datepart가 가장 잘 작동합니다.
두 날짜 간의 날짜 차이를 찾으려면 아래 트릭을 확인하십시오.
DATEDIFF(DAY,ordr.DocDate,RDR1.U_ProgDate) datedifff
원하는 날짜, 월, 년 또는 시간의 차이를 원하는 대로 변경할 수 있습니다.
CREATE FUNCTION getDateDiffHours(@fdate AS datetime,@tdate as datetime)
RETURNS varchar (50)
AS
BEGIN
DECLARE @cnt int
DECLARE @cntDate datetime
DECLARE @dayDiff int
DECLARE @dayDiffWk int
DECLARE @hrsDiff decimal(18)
DECLARE @markerFDate datetime
DECLARE @markerTDate datetime
DECLARE @fTime int
DECLARE @tTime int
DECLARE @nfTime varchar(8)
DECLARE @ntTime varchar(8)
DECLARE @nfdate datetime
DECLARE @ntdate datetime
-------------------------------------
--DECLARE @fdate datetime
--DECLARE @tdate datetime
--SET @fdate = '2005-04-18 00:00:00.000'
--SET @tdate = '2005-08-26 15:06:07.030'
-------------------------------------
DECLARE @tempdate datetime
--setting weekends
SET @fdate = dbo.getVDate(@fdate)
SET @tdate = dbo.getVDate(@tdate)
--RETURN @fdate
SET @fTime = datepart(hh,@fdate)
SET @tTime = datepart(hh,@tdate)
--RETURN @fTime
if datediff(hour,@fdate, @tdate) <= 9
RETURN(convert(varchar(50),0) + ' Days ' + convert(varchar(50),datediff(hour,@fdate, @tdate))) + ' Hours'
else
--setting working hours
SET @nfTime = dbo.getV00(convert(varchar(2),datepart(hh,@fdate))) + ':' +dbo.getV00(convert(varchar(2),datepart(mi,@fdate))) + ':'+ dbo.getV00(convert(varchar(2),datepart(ss,@fdate)))
SET @ntTime = dbo.getV00(convert(varchar(2),datepart(hh,@tdate))) + ':' +dbo.getV00(convert(varchar(2),datepart(mi,@tdate))) + ':'+ dbo.getV00(convert(varchar(2),datepart(ss,@tdate)))
IF @fTime > 17
begin
set @nfTime = '17:00:00'
end
else
begin
IF @fTime < 8
set @nfTime = '08:00:00'
end
IF @tTime > 17
begin
set @ntTime = '17:00:00'
end
else
begin
IF @tTime < 8
set @ntTime = '08:00:00'
end
-- used for working out whole days
SET @nfdate = dateadd(day,1,@fdate)
SET @ntdate = @tdate
SET @nfdate = convert(varchar,datepart(yyyy,@nfdate)) + '-' + convert(varchar,datepart(mm,@nfdate)) + '-' + convert(varchar,datepart(dd,@nfdate))
SET @ntdate = convert(varchar,datepart(yyyy,@ntdate)) + '-' + convert(varchar,datepart(mm,@ntdate)) + '-' + convert(varchar,datepart(dd,@ntdate))
SET @cnt = 0
SET @dayDiff = 0
SET @cntDate = @nfdate
SET @dayDiffWk = convert(decimal(18,2),@ntdate-@nfdate)
--select @nfdate,@ntdate
WHILE @cnt < @dayDiffWk
BEGIN
IF (NOT DATENAME(dw, @cntDate) = 'Saturday') AND (NOT DATENAME(dw, @cntDate) = 'Sunday')
BEGIN
SET @dayDiff = @dayDiff + 1
END
SET @cntDate = dateadd(day,1,@cntDate)
SET @cnt = @cnt + 1
END
--SET @dayDiff = convert(decimal(18,2),@ntdate-@nfdate) --datediff(day,@nfdate,@ntdate)
--SELECT @dayDiff
set @fdate = convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) + ' ' + @nfTime
set @tdate = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate)) + ' ' + @ntTime
set @markerFDate = convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) + ' ' + '17:00:00'
set @markerTDate = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate)) + ' ' + '08:00:00'
--select @fdate,@tdate
--select @markerFDate,@markerTDate
set @hrsDiff = convert(decimal(18,2),datediff(hh,@fdate,@markerFDate))
--select @hrsDiff
set @hrsDiff = @hrsDiff + convert(int,datediff(hh,@markerTDate,@tdate))
--select @fdate,@tdate
IF convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate))
BEGIN
--SET @hrsDiff = @hrsDiff - 9
Set @hrsdiff = datediff(hour,@fdate,@tdate)
END
--select FLOOR((@hrsDiff / 9))
IF (@hrsDiff / 9) > 0
BEGIN
SET @dayDiff = @dayDiff + FLOOR(@hrsDiff / 9)
SET @hrsDiff = @hrsDiff - FLOOR(@hrsDiff / 9)*9
END
--select convert(varchar(50),@dayDiff) + ' Days ' + convert(varchar(50),@hrsDiff) + ' Hours'
RETURN(convert(varchar(50),@dayDiff) + ' Days ' + convert(varchar(50),@hrsDiff)) + ' Hours'
END
저는 완벽하게 변환되었습니다(varchar(8), DATEADD(SECond, DEDIFF(SECond, LogInTime, LogOutTime, 0), 114).
출력은 HH입니다.MM:SS는 제 경우 정확하게 표시됩니다.
시도해 보세요
DECLARE @articleDT DATETIME;
DECLARE @nowDate DATETIME;
-- Time of the ARTICLE created
SET @articleDT = '2012-04-01 08:10:16';
-- Simulation of NOW datetime
-- (in real world you would probably use GETDATE())
SET @nowDate = '2012-04-10 11:35:36';
-- Created 9 days ago.
SELECT 'Created ' + CAST(DATEDIFF(day, @articleDT, @nowDate) AS NVARCHAR(50)) + ' days ago.';
-- Created 1 weeks, 2 days, 3 hours, 25 minutes and 20 seconds ago.
SELECT 'Created '
+ CAST(DATEDIFF(second, @articleDT, @nowDate) / 60 / 60 / 24 / 7 AS NVARCHAR(50)) + ' weeks, '
+ CAST(DATEDIFF(second, @articleDT, @nowDate) / 60 / 60 / 24 % 7 AS NVARCHAR(50)) + ' days, '
+ CAST(DATEDIFF(second, @articleDT, @nowDate) / 60 / 60 % 24 AS NVARCHAR(50)) + ' hours, '
+ CAST(DATEDIFF(second, @articleDT, @nowDate) / 60 % 60 AS NVARCHAR(50)) + ' minutes and '
+ CAST(DATEDIFF(second, @articleDT, @nowDate) % 60 AS NVARCHAR(50)) + ' seconds ago.';
2를 빼는 훨씬 간단한 방법입니다.datetime
값을 지정합니다.
DECLARE @startTime datetime = '2010-01-22 15:29:55.090';
DECLARE @stopTime datetime = '2010-01-22 15:30:09.153';
SELECT @stopTime - @startTime AS ElapsedTime
ElapsedTime
-----------------------
1900-01-01 00:00:14.063
(1 row affected)
테스트 완료: SQL Server 2000, 2019
MS SQL의 경우 datetime 값을 이중 값으로 변환할 수 있습니다.정수 부분에는 1900-01-01 이후의 일 수가 포함되며, 분수 부분에는 시간(시간)이 포함됩니다.따라서 날짜 차이를 다음과 같이 계산할 수 있습니다: cast(float로 date1-date2)
언급URL : https://stackoverflow.com/questions/2116540/difference-of-two-date-time-in-sql-server 입니다.
'programing' 카테고리의 다른 글
WebAPI 2에서 DefaultInlineConstraintResolver 오류가 발생했습니다. (0) | 2023.04.25 |
---|---|
기존 문자열에 어떻게 추가합니까? (0) | 2023.04.25 |
각도 HTML 바인딩입니다. (0) | 2023.04.25 |
Eclipse에서 SVN 저장소의 자격 증명을 변경하려면 어떻게 해야 합니까? (0) | 2023.04.25 |
WPF/C#에서 전역 키보드 후크(WH_KEYBOARD_LL)를 사용합니다. (0) | 2023.04.25 |