Объединить дату и время очень медленно, как сделать это эффективно? - PullRequest
0 голосов
/ 01 марта 2020

Это мой код

concat(CONVERT(varchar(10), cast(cast(cast(DATE1 as int) as char(8)) as date), 101),

Выше часть создает формат даты и затем объединяет ниже с:

', ',
convert(varchar(5), (convert(time, left(RIGHT('000000' + CONVERT(varchar(6), TIME1), 6), 2)
+ ':' + substring(RIGHT('000000' + CONVERT(varchar(6), TIME1), 6), 3, 2)
+ ':' + substring(RIGHT('000000' + CONVERT(varchar(6), TIME1), 6), 5, 2))), 108))

Возвращает время.

Объединение два в одной строке выводятся как мм / дд / гггг, 13: 00

Я преобразовываю исходные поля, где дата записывается в виде ггггммдд, а время записывается в виде 5-6 цифр, 71200 (7:12, но секунд всегда 00).

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

Примечание. Я объединяю дату с 4 различными временными столбцами, так что, возможно, это почему это занимает много времени?

1 Ответ

0 голосов
/ 01 марта 2020

Попробуйте использовать DATEADD вместо манипуляций со строками:

DATEADD(MINUTE, TIME1%10000/100, 
  DATEADD(HOUR,TIME1/10000, 
    CAST(CAST(CAST(DATE1 as int) AS char(8)) AS datetime))

TIME1 / 10000 should give you the number of hours.  71200 -> 7 
TIME1 % 10000 should give you the number of minutes * 100. 71200 -> 1200 
TIME1 % 10000 / 100 will give you the number of minutes.  71200 -> 12

Если вы часто запрашиваете эти данные (чаще, чем вставляете / обновляете их), или вам больше важна производительность запросов, чем обновление / вставка производительности, тогда вам следует подумать о создании в этой таблице постоянного вычисляемого столбца, чтобы вам не приходилось выполнять эти вычисления во время запроса. Затем вы также можете проиндексировать столбец, что очень поможет, если вы регулярно фильтруете по дате и времени.

...