Преобразовать текст в метку времени в красное смещение

У меня есть текстовое поле "sence_changed_at"с текстовыми значениями, т.е. '2014/12/17 08:05:28 +0000, Мне нужно преобразовать это в метку времени. В postgreSQL есть функция TO_TIMESTAMP (), однако в красном смещении это не поддерживается. Я могу получить дату без времени

TO_DATE("presence_changed_at",'YYYY/MM/DD HH24:MI:SS')

который производит

2014-12-12

но я не могу найти способ получить формат TIMESTAMP.

Заранее спасибо за решение этого

10 ответов

cast(column as timestamp)

работал для меня на красное смещение. См. http://devdocs.io/postgresql~9.4/sql-expressions.

Попробуйте преобразовать функцию:

convert(timestamp,presence_changed_at)

Вы можете привести его к отметке времени. Это поддерживает довольно много разумных форматов без указания одного.

select '2014/12/17 08:05:28 +0000'::timestamp;

      timestamp
---------------------
 2014-12-17 08:05:28

select '2014-12-02T05:00:00'::timestamp;
      timestamp
---------------------
 2014-12-02 05:00:00

select '2014-12-02T05:00:00PM'::timestamp;
      timestamp
---------------------
 2014-12-02 17:00:00

Ниже функции работали для меня правильно... Используйте то, что подходит для вас...

приведение (имя_ столбца как отметка времени)

to_date (имя столбца, "MM/DD/YYYY HH24:MI:SS")

to_date (имя столбца,'MM/DD/YYYY HH12:MI:SS')

метка времени (имя столбца, "ММ / ДД / ГГГГ ЧЧ24: MI: СС")

Удивительно ужасно получить дату и время из unixtime в красном смещении без подвыбора. Тем не менее, вы можете сделать это:

select timestamptz 'epoch' + YOURTIME * interval '1 second'

Использовать TO_TIMESTAMP(presence_changed_at,'YYYY/MM/DD HH24:MI:SS') который вернет TIMESTAMPTZ значение, которое можно преобразовать в TIMESTAMP с помощью ::TIMESTAMP.

Пожалуйста, используйте TO_Timestamp("presence_changed_at",'YYYY/MM/DD HH24:MI:SS') чтобы получить желаемый результат

На сегодняшний день to_timestamp поддерживается с помощью красного смещения. Итак, ваш SQL-запрос должен работать. Проверьте http://docs.aws.amazon.com/redshift/latest/dg/r_TO_TIMESTAMP.html

Если формат столбца даты " 2021-01-13T12 :14:43Z " (varchar)

Для преобразования в тип данных timestamptz :

      to_timestamp(datecolumn, 'yyyy-mm-dd hh:mi:ss')

Для преобразования в тип данных timestamp :

      cast(datecolumn as timestamp)

Оба приведут к одному и тому же выходному формату « 2021-01-13 12:14:43.000000 » .

Недавно я работал с базой данных, где переменная даты и времени была сохранена в виде текста в типе VARCHAR, в нескольких различных форматах (не спрашивайте...), и мне пришлось преобразовать ее в тип TIMESTAMP. Так как нет TO_TIMESTAMP() В Redshift я использовал трюк, предложенный Yiyu Jia в его [блоге][1]. В двух словах, дело в том, чтобы

  • используйте TO_DATE(), чтобы преобразовать дату
  • добавить временную часть входного текста к вышеуказанному
  • CAST полученную строку в TIMESTAMP

Например, вот фрагмент для работы с полем с именем myDate с датами в любом из следующих форматов

  • "8 февраля 2013 22:06"
  • "25.09.2007 16:21:00"

Это довольно тяжело, но работает. Тест регулярного выражения используется для проверки того, соответствует ли дата формату, указанному в данной строке. (это необходимо только при работе с несколькими возможными форматами)
Случай 'Feb 0 2013' немного сложнее, потому что я удаляю временную часть текста, прежде чем отправить его в TO_DATE(), и потому что другое регулярное выражение используется для извлечения добавляемой временной части (в отличие от более простого SUBSTRING). () используется для той же цели, в другом случае).

... ,
CASE
  -- Special date indicating "date not available": replaced by NULL
  WHEN myDate = '31/12/9999 23:59:59' OR myDate = 'Dec 31 9999 11:59PM' THEN NULL 
  -- 'Feb  8 2013 10:06PM' case
  WHEN myDate ~ '^[JFMASOND][a-z]{2}'  THEN
      CAST(TO_DATE(REGEXP_REPLACE(myDate , '\\s[0-9]{1,2}:[0-9]{2}[AP]M$', ''), 'Mon FMDD YYYY') || REGEXP_REPLACE(myDate , '[JFMASOND][a-z]{2}\\s+[0-9]{1,2}\\s+[0-9]{4}\\s+', ' ') AS TIMESTAMP)
  -- '25/09/2007 16:21:00' case
  WHEN myDate ~ '^[0-9]{2}/[0-9]{2}/[0-9]{4} '  THEN
      CAST(TO_DATE(myDate , 'DD/MM/YYYY HH24:MI:SS') || SUBSTRING(myDate FROM 11) AS TIMESTAMP)
  ELSE NULL
END AS MyNiceTimeStamp, 
...

  [1]: http://yiyujia.blogspot.com/2014/04/redshift-convert-integer-to-timestamp.html
Другие вопросы по тегам