Преобразовать текст в метку времени в красное смещение
У меня есть текстовое поле "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