Вычисление даты в формате HH.Формат Mi в TSQL

#tsql #sql-server-2008 #plsql

#tsql #sql-server-2008 #plsql

Вопрос:

Я переношу запрос из Oracle на sql server.Этот запрос содержит некоторые вычисления даты.Он вычисляет общее количество часов работы в формате hour: mi.Не могли бы вы помочь мне преобразовать его, потому что Datediff не содержит формат HH: Mi, а я новичок в sql server, поэтому я не знаю, как обрабатывать этот запрос в 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') 
  

Ответ №1:

Это определенно не обычная инструкция для переноса. Итак, если бы мне пришлось это делать, я бы начал с разбора инструкции на ее компоненты:

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)

TRIM , TRUNC MOD MIN и MAX для которых вы должны быть в состоянии найти эквиваленты в TSql.

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

Ответ №2:

Если я правильно вас понимаю, вы хотите получить общее время, отработанное сотрудником за период. Если у вас есть записи с начальной датой-временем и конечной датой-временем, вы просто могли бы использовать математику для 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

Ответ №3:

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

 CAST(CAST(getdate() as time(0)) as varchar(5)) "Time inn HHMI format"