#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"