Форматирование T-SQL Арифметика даты приводит к более дружественному формату - PullRequest
1 голос
/ 07 марта 2012

У меня есть несколько дат ...

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

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: я, вероятно, не включил бы секунды в окончательном отображении.

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

это покажет вам результат в формате 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'
1 голос
/ 07 марта 2012

На вашем вопросе написано "datepart".

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
0 голосов
/ 07 марта 2012

Использование DATEDIFF () даст вам период времени в выбранном вами формате.

Например, вы можете определить, сколько секунд будет между двумя датами, напримерИтак:

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

Затем, чтобы получить это в «днях, часах, минутах, секундах», вы можете использовать Определяемую пользователем функцию , чтобы вернуть это как nvarchar

Этот пост SO должен помочь вам достичь этого:

Преобразование секунд SQL в день: Час: Мин: сек

Тогда вы сделаете:

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

РЕДАКТИРОВАТЬ: Это решение будет работать только для дат, которые с интервалом менее 68 лет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...