У меня есть таблица, которая содержит значения даты и времени как тип данных INT. например, дата сохраняется как ГГГГММДД, например 20110901, а время сохраняется как ЧЧММСС, например 21826.
Дата близка к стандарту ISO, поэтому это не слишком большая проблема, но может ли кто-нибудь предложить простой способ преобразования в тип TIME? Я придумал ужасную комбинацию конкатенации, реверсирования, подстроки, преобразования, которую, как мне кажется, будет трудно прочитать другим сотрудникам.
Что вы хотите сделать, так это взять свою «ужасную комбинацию» и адаптировать ее для преобразования этих целочисленных пар в значения datetime. Затем протестируйте это, используя как можно больше крайних случаев, возможно, даже проверьте это вручную на случайном подмножестве ваших фактических данных. Если вам очень повезет, вы сможете использовать существующий код, отображающий ваши данные в виде строки, и написать сценарий, который сравнивает выходные данные кода преобразования с фактическими выходными данными, чтобы убедиться, что каждый экземпляр выстроен в линию и гарантирует совершенство.
Когда код будет готов, используйте его ровно один раз, чтобы скопировать данные в новый столбец datetime, который вы добавите в таблицу для этой цели. После этого удалите старый столбец и переименуйте новый, чтобы он соответствовал старому имени. Теперь обновите любой код, который вставляет / обновляет / читает из исходного столбца, чтобы использовать тип данных datetime. Тогда никогда больше об этом не говори.
Чтобы все это происходило гладко, вам необходимо скоординировать выполнение сценариев настройки таблиц с развертыванием нового кода приложения. Если это приложение, работающее круглосуточно и без выходных, это может быть непросто, но результат того стоит.
Это лучшее, что я могу придумать.
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), seconds = (1 / 24.0 / 3600.0), а затем сложите их вместе, только чтобы обнаружить, что вы не можете преобразовать float в тип данных TIME. Он скрывается в DATETIME, который затем можно преобразовать в TIME. , но кажется, что есть потеря точности, поэтому результат может отличаться на несколько миллисекунд.
Таким образом, подход с изменением текста кажется более чистым.