Расчет даты в формате HH.Mi в TSQL - PullRequest
1 голос
/ 04 мая 2011

Я переношу запрос из Oracle на сервер sql. Этот запрос содержит некоторые вычисления даты. Он рассчитывает общий рабочий час в час: формат mi. Не могли бы вы помочь мне преобразовать его, потому что Datediff не содержит формат HH: Mi и я Новое на сервере SQL, так что я не знаю, как работать с этим запросом в Mssql. За исключением Mod, все функции в следующем запросе, я создал в mssql.

SELECT dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE (MAX (END_HOUR),'HH24.MI') -
  dbo.TO_DATE (MIN (START_HOUR),'HH24.MI'))* 24,24)),'00'))  + ':'   
+ dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE(MAX(END_HOUR),'HH24.MI') - 
dbo.TO_DATE(MIN (START_HOUR),'HH24.MI'))* 24* 60,60)),'00')) TOTAL_TIME   FROM MY_TABLE 
 WHERE ID_PERSON in(  307,294,291,290,292,293)   AND DS_DATE BETWEEN 
 dbo.TO_DATE ('01.03.2011', 'dd.mm.yyyy') AND dbo.TO_DATE('03.05.2011', 'dd.mm.yyyy') 

Ответы [ 3 ]

0 голосов
/ 25 августа 2011

У меня была такая же проблема с форматом HH:MI, когда я пытался перенести запросы Oracle в sql. Я нашел следующий обходной путь:

CAST(CAST(getdate() as time(0)) as varchar(5)) "Time inn HHMI format"
0 голосов
/ 31 января 2012

Если я вас правильно понимаю, вы хотите получить общее время, которое сотрудник проработал за период.Если у вас есть записи с начальной датой и конечной датой, вы можете просто использовать математику с типом datetime-datatype.

Если вы хотите получить рабочее время одного дня, просто сделайте что-то вроде:

select time1, time2, convert (varchar(8),time2-time1,108) from timecalc

Тип данных datetime - число, начиная с 1.1.1900.Поэтому, если значения datetime отличаются на 6 часов, вы получите 1900-01-01 06: 00: 00.000.

Вы можете преобразовать это в varchar, чтобы работать с этим и получать часы и минуты, какв примере я разместил 06: 00: 00.

Для работы с минутами и секундами вы используете:

dateadd()


Convert(type, value, format)

, наберите:

Convert(Varchar(8),date, 108)

Для получения подробной информациио форматах: http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx

0 голосов
/ 04 мая 2011

Это определенно не тривиальное утверждение для порта.Поэтому, если бы мне пришлось это сделать, я бы начал с того, что разобрал утверждение на составляющие:

dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE (MAX (END_HOUR),'HH24.MI') - dbo.TO_DATE (MIN (START_HOUR),'HH24.MI'))* 24,24)),'00'))

и

dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE(MAX(END_HOUR),'HH24.MI') - dbo.TO_DATE(MIN (START_HOUR),'HH24.MI'))* 24* 60,60)),'00'))

и затем пытаясь разбить каждый из них на более мелкие части.

TO_CHAR и TO_DATE можно сделать с помощью TSql convert(### as datetime) и cast(### as varchar)

The TRIM, TRUNC, MOD, MIN и MAX вы можете найти эквиваленты в TSql.

Ссылка на Transact-SQL находится здесь .

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