#db2 #timestamp
#db2 #временная метка
Вопрос:
У меня есть столбец временной метки типа данных. Теперь мне нужно преобразовать ее в миллисекунды и поместить в другой столбец. Как я могу это сделать. входные данные имеют формат 2011-10-04 13:54:50.455227
, а выходные данные должны быть 1317900719
Комментарии:
1. Привет, когда вы говорите, что хотите преобразовать его в миллисекунды; Миллисекунды от какого значения? сравнивается ли оно с другим столбцом временной метки или с постоянным значением временной метки или принимает только часть миллисекунд из того же столбца временной метки?
2. Отредактировал вопрос с помощью форматов.
3. Я не понимаю, как вы получаете желаемый результат. Я бы ожидал, что если вы хотите ms, вы должны, по крайней мере, закончить на 50455.
Ответ №1:
Существует функция, называемая timestampdiff . Использование его с 1 января 1970 года будет работать иначе, но функция дает приблизительные результаты. Если вам нужна точность, вам нужно будет вычислить правильный ответ с помощью чего-то вроде
create function ts2millis(t timestamp)
returns bigint
return (
(
(bigint(year(t-1970))*bigint(31556926000))
(bigint(month(t))*bigint(2629743000))
(bigint(day(t))*bigint(86400000))
(bigint(hour(t))*bigint(3600000))
(bigint(minute(t))*bigint(60000))
(bigint(second(t))*bigint(1000))
(bigint(microsecond(t))/bigint(1000))
)
)
@
Комментарии:
1. В разных месяцах разное количество дней (иначе миллисекунд), поэтому вы не можете использовать фиксированное значение. Тем более, что февраль имеет разные значения в зависимости от года.
Ответ №2:
Запрошенный вами результат не равен миллисекундам, а эквивалентен CLib localtime(), вот как это сделать:
SELECT
86400*
(
DAYS(TIMESTAMP(v_timestamp))
-
DAYS(TIMESTAMP('1970-01-01-00:00:00'))
)
MIDNIGHT_SECONDS(timestamp(v_timestamp))
FROM
SYSIBM.SYSDUMMY1;
где v_timestamp
находится переменная или столбец, который нужно вычислить.