Преобразование временной метки в миллисекунды в DB2

#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 находится переменная или столбец, который нужно вычислить.