Преобразование INT в ДАТУ / ВРЕМЯ
У меня есть таблица, которая содержит значения даты и времени в качестве типа данных INT. например, дата хранится в формате ГГГГММДД, например, 20110901, а время сохраняется в формате ЧЧММСС, например, 21826.
Дата близка к стандарту ISO, поэтому это не слишком большая проблема, однако кто-нибудь может предложить простой способ преобразования в тип времени, пожалуйста? Я придумал отвратительное сочетание конкатенации, реверсирования, подстроки, преобразования, которое, как я боюсь, будет трудно прочитать другим сотрудникам.
2 ответа
Что вы хотите сделать, так это взять свою "отвратительную комбинацию" и адаптировать ее для преобразования этих целочисленных пар в значения даты и времени. Затем протестируйте его, используя как можно больше граничных случаев, возможно, даже проверяйте его вручную по случайному подмножеству ваших фактических данных. Если вам очень повезет, вы сможете использовать существующий код, который отображает ваши данные в виде строки, и написать сценарий, который сравнивает вывод кода преобразования с фактическим выводом, чтобы убедиться, что каждый экземпляр выстроен в линию и гарантирует совершенство.
Когда код будет готов, используйте его ровно один раз, чтобы скопировать данные в новый столбец даты и времени, который вы добавите в таблицу для этой цели. После этого удалите старый столбец и переименуйте новый, чтобы он соответствовал старому имени. Теперь обновите любой код, который вставляет / обновляет / читает из исходного столбца, чтобы использовать тип данных datetime. Тогда никогда не говори об этом снова.
Чтобы все это происходило гладко, вам нужно скоординировать выполнение сценариев настройки таблицы с развертыванием нового кода приложения. Если это 24/7 приложение, которое может быть сложным, но результат должен того стоить.
Это лучшее из того, что я могу придумать.
select
-- convert string to time value
CONVERT(time
-- insert a colon between hours and minutes (position 3)
, STUFF(
-- insert a colon between minutes and seconds (position 5)
STUFF(
-- convert to string, pad left with zeroes to 6 characters
RIGHT('000000' + CONVERT(varchar(6), @time_value_int), 6)
, 5, 0, ':')
, 3, 0, ':')
) as time_converted
Сначала я начал по математическому маршруту, взяв целочисленное значение времени и используя целочисленное деление и модуль, чтобы получить части часов, минут и секунд, и умножив их на число с плавающей точкой, эквивалентное этой части времени (часы = 1 / 24,0, минуты = ( 1 / 24.0 / 60.0), секунд = ( 1 / 24.0 / 3600.0), затем складываем их вместе только для того, чтобы обнаружить, что вы не можете преобразовать число с плавающей точкой в тип данных TIME. Он преобразуется в DATETIME, который затем можно преобразовать в TIME., но кажется, что есть потеря в точности, поэтому результат может быть несколько миллисекунд.
Таким образом, подход к обработке текста кажется чище.