Формат даты SQL [ч]: мм: сс, как в Excel, за пределами 24 часов

Есть ли перевод для встроенного в Excel формата даты format [h]:mm:ss в T-SQL или любой платформе SQL?

пример:

    General [h]:mm:ss   [mm]:ss     [ss]
   1.00000  24:00:00    1440:00         86400
   1.00000  24:00:00    1440:00         86400

СУММА

   2.00000  48:00:00    2880:00         172800

Для T-SQL я выберу

Without century (yy) (1)    With century (yyyy) Standard    Input/Output (3)
  14                             114                   -    hh:mi:ss:mmm(24h)

Или по умолчанию 108, я понимаю, нужно ли мне воссоздавать функцию, которая может выполнять hh:mi:ss:mmm(+24h)?

Комментарии очень приветствуются;


person Holanda Corella    schedule 06.02.2013    source источник


Ответы (1)


В то время как тип данных SQL Server time должен сопоставляться с типом данных CLR timepan , он поддерживает только интервалы менее 24 часов.

SQL Server datediff также сложен, когда дело доходит до вычисления интервала как он вычисляет границы частей даты, пересекаемые между двумя датами и временем. Например, это должен быть интервал в 1 секунду, но datediff сообщит вам, что это час, если вы спросите часы:

select datediff(hh, '2013-01-01T23:59:59', '2013-01-02T00:00:00')
-- Returns 1

Таким образом, вам, возможно, придется свернуть свою собственную функцию, когда дело доходит до этого, хотя, надеюсь, этот ответ поможет вам начать работу:

-- Setup test data
declare @minDate datetime = '2012-12-12 20:16:47.160'
declare @maxDate datetime = '2012-12-17 15:10:12.050'

-- Get timespan in hh:mi:ss
select cast(
        (cast(cast(@maxDate as float) - cast(@minDate as float) as int) * 24) /* hours over 24 */
        + datepart(hh, @maxDate - @minDate) /* hours */
        as varchar(10))
    + ':' + right('0' + cast(datepart(mi, @maxDate - @minDate) as varchar(2)), 2) /* minutes */
    + ':' + right('0' + cast(datepart(ss, @maxDate - @minDate) as varchar(2)), 2) /* seconds */

-- Returns 114:53:24
person Tim Lehner    schedule 06.02.2013
comment
Попробую это, поговорив с моим партнером, чтобы увидеть, как это реализовать, потому что у нас уже есть данные в десятичных дробях, но да, действительно хорошее начало! - person Holanda Corella; 07.02.2013
comment
Я бы никогда не подумал, что T-SQL time должен отображать тип временного интервала на стороне клиента. Я всегда считал это моментом времени, точно так же, как datetime или datetime2, но без даты. Спасибо за ссылку, которая открыла (точнее расширила) глаза. - person Andriy M; 09.02.2013