2015-07-26 2 views
6

J'ai un champ de texte "presence_changed_at" avec des valeurs textuelles, c'est-à-dire '2014/12/17 08:05:28 +0000. J'ai besoin de convertir cela en horodatage. Dans postgreSQL, il y a la fonction TO_TIMESTAMP(), mais dans redshift cela ne semble pas être supporté. Je peux obtenir la date sans temps parConvertir le texte en horodatage dans redshift

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

qui produit

2014-12-12 

mais je ne peux pas trouver un moyen d'obtenir timestamp.

Merci à l'avance pour résoudre ce

+0

Avez-vous essayé COVERT ... comme horodatage? Veuillez noter qu'il est préférable de faire la conversion dans le cadre de la commande COPY dans le cadre des requêtes. – Guy

Répondre

3

essayer la fonction convertir:

convert(timestamp,presence_changed_at) 
+0

Merci d'avoir suggéré 'CONVERT()'; Cependant, cette fonction ne fonctionne que lorsque la chaîne est dans le format implicite de l'hôte (le format de chaîne par défaut). Je voudrais trouver quelque chose de similaire à 'TO_TIMESTAMP()' pour que je puisse lui passer un format de date arbitraire. – mjv

0

J'ai récemment travaillé sur une base de données où une date & variable de temps a été stocké sous forme de texte dans un type de VARCHAR, dans plusieurs différents formats (ne demandez pas ...), et a dû le convertir en un type TIMESTAMP. Puisqu'il n'y a pas de fonction TO_TIMESTAMP() dans Redshift, j'ai utilisé l'astuce proposée par Yiyu Jia sur son [blog] [1]. En un mot, pour obtenir la date convertie

  • append la partie temporelle du texte d'entrée au-dessus
  • CAST la chaîne résultante à un TIMESTAMP
  • l'astuce consiste à

    • utilisation TO_DATE()

      par exemple, voici l'extrait pour traiter un champ nommé myDate avec des dates dans l'un des formats suivants

      • « 8 février 2013 22:06 »
      • "25/09/2007 16:21:00"

      Il est assez lourd, mais fonctionne. Un test d'expression régulière est utilisé pour tester si la date correspond au format manipulé sur une ligne donnée. (Ceci n'est nécessaire que pour traiter plusieurs formats possibles)
      Le cas 'Feb 0 2013' est un peu plus compliqué car je supprime la partie temps du texte, avant de l'envoyer à TO_DATE(), et parce qu'une autre regex est utilisée pour extraire la portion de temps qui est ajoutée (par opposition à la plus simple SUBSTRING() utilisée 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 
      
    +0

    La mise en place d'un boîtier entraîne de graves problèmes de performances. l'expression rationnelle a de graves conséquences sur les performances et la correction. –

    2

    Il est étonnamment horrible obtenir un datetime d'un unixtime dans redshift sans subselect. Cependant, vous pouvez le faire:

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

    +0

    Vous pouvez également faire TIMESTAMP si vos heures sont toutes stockées dans UTC et vous n'utilisez pas les colonnes TIMESTAMPTZ – ZiggyTheHamster

    2

    S'il vous plaît utiliser TO_Timestamp("presence_changed_at",'YYYY/MM/DD HH24:MI:SS') pour obtenir la sortie désirée

    +0

    Utile, mais il ajoute un +00 car c'est un type de données TIMESTAMPTZ - que se passe-t-il si mes données ne sont pas en UTC? Ce +00 est trompeur. – ScottEdwards2000

    +0

    Son travail pour moi –

    1

    Vous pouvez jeter 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