Форматирование времени в SQL как day.hour - PullRequest
0 голосов
/ 04 мая 2011

Я создаю отчет из хранимой процедуры, которая извлекает две даты / времени (CreatedDate и ClosedDate). Мне нужен столбец в отчете, который показывает разницу (то есть время, необходимое для перехода от открытия к закрытию). Во-первых, я просто вычел CreatedDate из ClosedDate (в отчете [службы отчетов SQL Server], а не в хранимой процедуре) и получил время, которое выглядит следующим образом: 72.20: 34: 18.6230000 (day.hour: minute: second). Мне нужно уменьшить это, если возможно, до дня. Час ...

Я экспериментировал с некоторыми функциями, найденными в MSDN (http://msdn.microsoft.com/en-us/library/ms186724.aspx). DATEDIFF почти дает мне то, что мне нужно, но я могу указать только дни или часы, и в идеале (как я уже сказал) мне нужно, чтобы он показывал ' время для закрытия », как оба (день. час).

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 05 мая 2011

В SSRS вы можете применить пользовательский формат к этому столбцу, чтобы показывать только days.hours. Щелкните правой кнопкой мыши столбец в режиме конструктора -> свойства текстового поля -> Число (слева). Если вы не видите один из форматов для даты, времени или числа, который соответствует тому, что вам нужно, создайте пользовательский формат внизу.

0 голосов
/ 04 мая 2011
  • Конвертировать в минуты
  • деление на 1440 дает целые дни
  • по модулю 1440 дает оставшиеся минуты, разделите на 60 для часов

Что-то вроде (не проверено):

SELECT
    CAST(DATEDIFF(minute, CreatedDate, ClosedDate) / 1440 AS varchar(20)) + '.'
    CAST((DATEDIFF(minute, CreatedDate, ClosedDate) % 1440) / 60 AS varchar(20))
FROM
    MyTable

Возможно, вам придется поиграть с часовым представлением в cade, которое я неправильно понял

DATEDIFF для дня и часа идет по границам: то есть, если между двумя значениями, охватывающими полночь, будет всего 3 минуты, будет разница в один час / день. Так что я использовал минуты

Edit:

Для переполнения int из DATEDIFF требуется разница в 4000+ лет

Мысль:

  • Использование datetime2 и CreatedDate наименьшего 0001-01-01
  • ClosedDate - это значение часового типа, например 9999-12-31, скажем, для "открытых" элементов
  • CreatedDate и ClosedDate являются varchar, и преобразование в datetime является ошибочным

Ваш пример показывает разницу в 72 дня, что составляет около 104 тыс. Минут.

Я бы попробовал это, чтобы увидеть, где у вас разница в 1000 с лишним лет, которая составляет всего полмиллиарда или около того минут:

SELECT * FROM mytables
WHERE DATEDIFF(year, CreatedDate, ClosedDate) > 1000
...