2012-03-07 55 views
1

我有一些日期...T-SQL格式化日期的友好格式的运算结果

1900-01-01 00:06:11.847 
1900-01-01 00:09:12.097 
1900-01-01 01:16:08.533 
1900-01-12 20:08:04.453 
1900-01-12 20:08:04.517 
1902-12-30 04:58:52.500 
1902-12-30 05:04:08.840 
1903-08-30 21:03:07.187 
1904-01-31 20:18:10.063 
1904-04-02 06:05:52.313 
1905-02-27 04:08:07.353 
1905-04-02 22:08:07.377 

作为查询的结果...

SELECT ... GetDate() - [LastRunTime] as 'Age' .... 

我想结果比如1d 3h 17m 25s

任何帮助将不胜感激。

编辑:我可能不会在最后的显示中包括秒。

回答

0

使用DATEDIFF()会以您选择的格式给您一段时间。

例如,你可以工作了多少秒都在2个日期像这样之间:

SELECT DATEDIFF(s, [LastRunTime], GETDATE()) 

然后进入“天,时,分,秒”这一点,你可以使用一个用户定义函数返回以此为nvarchar

这SO后应该可以帮助您实现这一目标:

SQL Convert Seconds into Day:Hour:Min:Sec

然后,你会怎么做:

SELECT dbo.DHMS(DATEDIFF(s, [LastRunTime], GETDATE())) 

编辑:该解决方案将仅适用于该日期相隔少超过68以上工作。

+0

这种方法仅适用于秒日期部分的差值小于68年的情况,否则会引发溢出错误。 – codingbadger 2012-03-07 12:55:24

3

这会告诉你导致XD XH XM格式:

select CAST(datediff(dd, [LastRunTime], GetDate()) AS VARCHAR(12))+'d '+ 
CAST(datediff(hh, [LastRunTime], GetDate())%24 AS VARCHAR(2))+'h '+ 
CAST(datediff(n,[LastRunTime], GetDate())%60 AS VARCHAR(2))+'m' 
+0

嗯,这不会返回所有日子,小时,分钟吗?例如,如果日期差异为1天,则会返回:'1d 24小时,1440s' – Curt 2012-03-07 12:38:38

+0

没有。我正在使用% – Vikram 2012-03-07 12:41:42

+0

啊我错过了。我测试了你的查询,并且它很好,但是'GETDATE()'和'LastRunTime'需要反转,否则你会得到负值。你有'%'文件的任何链接吗?我从来没有见过它在这种情况下使用 – Curt 2012-03-07 12:45:04

1

你的问题有 '日期部分' 写了这一切。

declare @t table(dates datetime) 
insert @t values('1900-01-01 00:06:11.847') 
insert @t values('1900-01-01 00:09:12.097') 

select cast(datepart(day, getdate() - dates) as varchar(2))+' d ' 
    + cast(datepart(hour, getdate() - dates) as varchar(2))+' h ' 
    + cast(datepart(minute, getdate()- dates) as varchar(2))+' m ' 
    + cast(datepart(second, getdate()- dates) as varchar(2))+' s' 
from @t