J'ai un champ de texte "presence_changed_at" avec des valeurs de texte, à savoir '2014/12/17 08:05:28 +0000
. J'ai besoin de convertir ceci en horodatage. Dans postgreSQL, il existe une fonction TO_TIMESTAMP () , mais dans redshift cela ne semble pas être pris en charge. Je peux obtenir la date sans heure par
TO_DATE("presence_changed_at",'YYYY/MM/DD HH24:MI:SS')
qui produit
2014-12-12
mais je ne trouve aucun moyen d'obtenir le format TIMESTAMP.
Merci d'avance pour résoudre ce problème
essayez de convertir la fonction:
convert(timestamp,presence_changed_at)
C'est étonnamment horrible d'obtenir une date-heure à partir d'unix dans redshift sans sous-sélection. Cependant, vous pouvez faire ceci:
select timestamptz 'Epoch' + YOURTIME * interval '1 second'
cast(column as timestamp)
travaillé pour moi sur redshift. Voir http://devdocs.io/postgresql~9.4/sql-expressions#SQL-SYNTAX-TYPE-CASTS
Veuillez utiliser TO_Timestamp("presence_changed_at",'YYYY/MM/DD HH24:MI:SS')
pour obtenir le résultat souhaité.
Vous pouvez le lancer sur un horodatage. Cela supporte pas mal de formats raisonnables sans avoir à en spécifier un.
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
À partir d’aujourd’hui, to_timestamp est pris en charge par redshift. Votre requête SQL devrait donc fonctionner. Vérifiez http://docs.aws.Amazon.com/redshift/latest/dg/r_TO_TIMESTAMP.html
Les fonctions ci-dessous ont fonctionné correctement pour moi ... Utilisez ce qui vous est applicable ...
cast (nom_colonne en tant qu'horodatage)
to_date (nom_colonne, 'MM/JJ/AAAA HH24: MI: SS')
to_date (nom_colonne, 'MM/JJ/AAAA HH12: MI: SS')
to_timestamp (nom_colonne, 'MM/JJ/AAAA HH24: MI: SS')
J'ai récemment travaillé sur une base de données dans laquelle une variable de date et heure était stockée sous forme de texte dans un type VARCHAR, dans plusieurs formats différents (ne pas demander ...), et devait être convertie en un type TIMESTAMP. Puisqu'il n'y a pas de fonction TO_TIMESTAMP()
dans Redshift, j'ai utilisé le truc suggéré par Yiyu Jia sur son [blog] [1]. En bref, le truc est de
Par exemple, voici l'extrait de code pour traiter un champ nommé myDate avec des dates dans l'un des formats suivants
C'est plutôt lourd, mais ça marche. Un test de regex est utilisé pour vérifier si la date correspond au format traité sur une ligne donnée. (nécessaire uniquement lorsque plusieurs formats sont possibles)
Le cas «février 0 2013» est un peu plus compliqué parce que je supprime la partie heure du texte avant de l'envoyer à TO_DATE () et parce qu'une autre expression rationnelle est utilisée pour extraire la partie heure qui est ajoutée ( par opposition à SUBSTRING () plus simple utilisé dans le même but, dans l’autre cas).
... ,
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