给定两个日期/时间:
@start_date = '2009-04-15 10:24:00.000'
@end_date = '2009-04-16 19:43:01.000'
能否在以下格式中计算两个日期之间的经过时间
1天9小时19分钟
给定两个日期/时间:
@start_date = '2009-04-15 10:24:00.000'
@end_date = '2009-04-16 19:43:01.000'
能否在以下格式中计算两个日期之间的经过时间
1天9小时19分钟
您可以获取两个日期之间的差异,精确到任何你想要的分辨率(在你的例子中是分钟):
DATEDIFF(minute, @start_date, @end_date)
从那里开始,只需将分钟转换成小时并将小时转换成天,并对余数进行模运算即可。
我知道这个帖子有些旧了,原来的参与者可能已经不再关注了,但我偶然发现它,并且最近已经编写了一些非常接近jdiaz所请求的代码。结果以D:H:M:S格式呈现为字符串。
第一步是获取时间跨度(以秒为单位):
DECLARE @ElapsedS INT
SET @ElapsedS = DATEDIFF(second, @start_date, @end_date)
现在创建以下标量函数:
CREATE FUNCTION [dbo].[udfTimeSpanFromSeconds]
(
@Seconds int
)
RETURNS varchar(15)
AS
BEGIN
DECLARE
--Variable to hold our result
@DHMS varchar(15)
--Integers for doing the math
, @Days int --Integer days
, @Hours int --Integer hours
, @Minutes int --Integer minutes
--Strings for providing the display
, @sDays varchar(5) --String days
, @sHours varchar(2) --String hours
, @sMinutes varchar(2) --String minutes
, @sSeconds varchar(2) --String seconds
--Get the values using modulos where appropriate
SET @Hours = @Seconds/3600
SET @Minutes = (@Seconds % 3600) /60
SET @Seconds = (@Seconds % 3600) % 60
--If we have 24 or more hours, split the @Hours value into days and hours
IF @Hours > 23
BEGIN
SET @Days = @Hours/24
SET @Hours = (@Hours % 24)
END
ELSE
BEGIN
SET @Days = 0
END
--Now render the whole thing as string values for display
SET @sDays = convert(varchar, @Days)
SET @sHours = RIGHT('0' + convert(varchar, @Hours), 2)
SET @sMinutes = RIGHT('0' + convert(varchar, @Minutes), 2)
SET @sSeconds = RIGHT('0' + convert(varchar, @Seconds), 2)
--Concatenate, concatenate, concatenate
SET @DHMS = @sDays + ':' + @sHours + ':' + @sMinutes + ':' + @sSeconds
RETURN @DHMS
END
现在将时间间隔(feed your timespan)输入到新创建的函数中:
SELECT TimeSpan = dbo.udfTimeSpanFromSeconds(@ElapsedS)
应该输出 '1:09:19:01'
CONVERT(
varchar(8),
(
CAST(@end_date AS DATETIME)
-
CAST(@start_date AS DATETIME)
)
,108
)
这将以HH:MM:SS的格式给您。
干杯!
DATEDIFF 可能会返回令人费解的值。例如,下面两个日期相差一秒钟,但是如果使用以下参数调用 DATEDIFF 并按照其他人已经解释的方式进行解释,则返回 1 年:
SELECT DATEDIFF(year, '2005-12-31 23:59:59', '2006-01-01 00:00:00')
请查看 MSDN 文档以了解 DATEDIFF 的工作原理。
Declare @Date1 as Datetime, @Date2 as Datetime
Set @Date1 = '2005-01-01 08:00:00'
Set @Date2 = '2005-02-20 16:35:30'
Select
CAST(DATEDIFF(Minute,@Date1, @Date2)/60/24 as Varchar(50)) ++ 'd ' ++
CAST((DATEDIFF(Minute,@Date1, @Date2)/60)-((DATEDIFF(Minute,@Date1, @Date2)/60/24)*24) as Varchar(50)) ++ 'h ' ++
CAST((DATEDIFF(Minute,@Date1, @Date2)) - (DATEDIFF(HOUR,@Date1, @Date2)*60) as Varchar(50)) ++ 'm' as FormattedDateDiff
datediff(datepart, date1, date2);
Rex的回答更加完整。
DECLARE @FirstDate DATETIME, @SecondDate DATETIME, @result VARCHAR(MAX)
SELECT @FirstDate = '2017-03-01 09:54:00.637', @SecondDate = GETDATE()
DECLARE @Day INT,@Month INT,@Hour INT, @Minute INT,@TotalSeconds INT,@Year INT
SELECT @TotalSeconds = ABS(DATEDIFF(SECOND,@FirstDate,@SecondDate))
-- Standard values in seconds
DECLARE @YearSeconds INT, @MonthSeconds INT, @DaySeconds INT, @HourSeconds INT, @MinuteSeconds INT
SELECT @MinuteSeconds = 60
SELECT @HourSeconds = 60 * @MinuteSeconds
SELECT @DaySeconds = 24 * @HourSeconds
SELECT @MonthSeconds = 30 * @DaySeconds
SELECT @YearSeconds = 12 * @MonthSeconds
--SELECT @MinuteSeconds AS [Minutes], @HourSeconds AS [Hours], @DaySeconds AS [Day],@MonthSeconds AS [Month],@YearSeconds AS [Year]
IF @TotalSeconds < @MinuteSeconds
BEGIN
SELECT @result = CAST(@TotalSeconds AS NVARCHAR(20)) + ' seconds ago'
END
ELSE IF @TotalSeconds < @HourSeconds
BEGIN
SELECT @result = CAST(ABS(DATEDIFF(MINUTE,@FirstDate,@SecondDate)) AS NVARCHAR(20)) + ' minutes ago'
END
ELSE IF @TotalSeconds < @DaySeconds
BEGIN
SELECT @result = CAST(ABS(DATEDIFF(HOUR,@FirstDate,@SecondDate)) AS NVARCHAR(20)) + ' hours ago'
END
ELSE IF @TotalSeconds < @MonthSeconds
BEGIN
SELECT @result = CAST(ABS(DATEDIFF(DAY,@FirstDate,@SecondDate)) AS NVARCHAR(20)) + ' days ago'
END
ELSE IF @TotalSeconds < @YearSeconds
BEGIN
SELECT @result = CAST(ABS(DATEDIFF(MONTH,@FirstDate,@SecondDate)) AS NVARCHAR(20)) + ' months ago'
END
ELSE IF @TotalSeconds > @YearSeconds
BEGIN
SELECT @result = CAST(ABS(DATEDIFF(YEAR,@FirstDate,@SecondDate)) AS NVARCHAR(20)) + ' year ago'
END
SELECT @result
- RIGHT('0' + CAST(DATEDIFF(second, @start_date, @end_date) % 3600 / 60 AS varchar(2)), 2) + ':'
- RIGHT('0' + CAST(DATEDIFF(second, @start_date, @end_date) % 60 AS varchar(2)), 2) - 哎呀,有人知道如何在注释中转义“@”符号吗?
- needfulthing