用时间计算两个日期之间经过的时间

Posted

技术标签:

【中文标题】用时间计算两个日期之间经过的时间【英文标题】:Calculating elapsed time between two dates with times 【发布时间】:2013-12-06 07:28:43 【问题描述】:

我创建了一个函数,它需要 2 个日期并返回描述性持续时间,如下所示:

1 年 3 个月 2 周 5 天 10 小时

这个函数我面临的问题是,如果持续时间小于一个月,但如果两个日期属于不同的月份,它会返回月份持续时间。

有人可以帮我调整一下这个功能吗?

您可以在此处找到查询:

https://data.stackexchange.com/***/query/edit/149306

如您所见,我将开始日期传递为 2013-08-29 13:48:35.710 并将结束日期传递为 2013-09-03 17:04:27.493 并且应该将持续时间返回为 5 days 3 hours 15 minutes 但它返回 1 个月 3 小时 15 分钟。

如何调整它以显示正确的持续时间?

【问题讨论】:

仅确定以分钟(或小时)为单位的时差,然后使用数学计算其余部分(每小时 60 分钟、每天 1440 分钟、每周 10080 分钟等),从总分钟数。您可能还需要考虑闰年,但如果做得正确,这是一个可行且准确的选择。 呃,不。 4个月=几个小时?使用内置的日期操作,而不是编写在 DST、闰年和闰秒上失败的蹩脚的操作。 【参考方案1】:
DECLARE @date1 DATETIME, @date2 DATETIME
DECLARE @result VARCHAR(100)
DECLARE @years BIGINT, @months BIGINT, @weeks BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT
DECLARE @KEEP DATETIME

SET @date1 = '20130829 13:48:35.710'
SET @date2 = '20130903 17:04:27.493'

if @date1>@date2 
begin
  SET @KEEP=@date1
  SET @date1=@date2
  SET @date2=@KEEP  
end

Select @years=DATEDIFF(yy,@date1,@date2)
if DateAdd(yy,-@years,@date2)<@date1 Select @years=@years-1
Set @date2= DateAdd(yy,-@years,@date2)

Select @months=DATEDIFF(mm,@date1,@date2)
if DateAdd(mm,-@months,@date2)<@date1 Select @months=@months-1
Set @date2= DateAdd(mm,-@months,@date2)

Select @weeks=DATEDIFF(wk,@date1,@date2)
if DateAdd(wk,-@weeks,@date2)<@date1 Select @weeks=@weeks-1
Set @date2= DateAdd(wk,-@weeks,@date2)        

Select @days=DATEDIFF(dd,@date1,@date2)
if DateAdd(dd,-@days,@date2)<@date1 Select @days=@days-1
Set @date2= DateAdd(dd,-@days,@date2)

Select @hours=DATEDIFF(hh,@date1,@date2)
if DateAdd(hh,-@hours,@date2)<@date1 Select @hours=@hours-1
Set @date2= DateAdd(hh,-@hours,@date2)

Select @minutes=DATEDIFF(mi,@date1,@date2)

Select @result= ISNULL(CAST(NULLIF(@years,0) as varchar(10)) + ' Years','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) as varchar(10)) + ' Months','')
     + ISNULL(' ' + CAST(NULLIF(@weeks,0) as varchar(10)) + ' Weeks','')     
     + ISNULL(' ' + CAST(NULLIF(@days,0) as varchar(10)) + ' Days','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) as varchar(10)) + ' Hours','')
     + ISNULL(' ' + CAST(@minutes as varchar(10)) + ' Minutes','')

Select @result     

-- OUTPUT :  5 Days 3 Hours 16 Minutes

【讨论】:

我喜欢你如何将 OP 的代码重构为一个小而紧凑的工作版本 :) 很好的解决方案,但缺少周组件。这不是投诉。 :)

以上是关于用时间计算两个日期之间经过的时间的主要内容,如果未能解决你的问题,请参考以下文章

js计算两个日期间的所有日期

mysql 计算两个日期间有多少个2月29

SQL Server - 以 HH:MM:SS 格式计算两个日期时间戳之间的经过时间

Excel中计算两个日期之间的天数,扣除周六周日

将两个给定日期之间的月、年和日计算为时间戳[重复]

如何在VB中计算两个日期间的天数