web-dev-qa-db-ja.com

redshiftでテキストをタイムスタンプに変換する

テキストフィールド "presence_changed_at"があり、テキスト値、つまり'2014/12/17 08:05:28 +0000。これをタイムスタンプに変換する必要があります。 postgreSQLには関数TO_TIMESTAMP()がありますが、redshiftではこれはサポートされていないようです。私は時間なしで日付を得ることができます

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

生成する

2014-12-12

しかし、TIMESTAMP形式を取得する方法が見つかりません。

これを解決してくれてありがとう

10
user5157294

副選択なしでredshiftのUNIX時間から日時を取得するのは驚くほど恐ろしいことです。ただし、これは可能です。

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

3
John Haugeland
cast(column as timestamp)

redshiftで私のために働いた。 http://devdocs.io/postgresql~9.4/sql-expressions#SQL-SYNTAX-TYPE-CASTS を参照してください

3
Harry Moreno

関数を変換してみてください:

convert(timestamp,presence_changed_at)
3
user3600910

タイムスタンプにキャストできます。これは、1つを指定しなくても、かなりの数の適切なフォーマットをサポートします。

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
2
systemjack

TO_Timestamp("presence_changed_at",'YYYY/MM/DD HH24:MI:SS')を使用して、目的の出力を取得してください

2
Saurabh Gautam

以下の機能は私にとって正しく機能しました...あなたに当てはまる方を使用してください...

cast(column_name as timestamp)

to_date(列名、 'MM/DD/YYYY HH24:MI:SS')

to_date(列名、 'MM/DD/YYYY HH12:MI:SS')

to_timestamp(column_name、 'MM/DD/YYYY HH24:MI:SS')

1
karthik G

現在、to_timestampはredshiftでサポートされています。したがって、SQLクエリは機能するはずです。チェック http://docs.aws.Amazon.com/redshift/latest/dg/r_TO_TIMESTAMP.html

1
Dheeraj M R

TO_TIMESTAMP(presence_changed_at,'YYYY/MM/DD HH24:MI:SS')を使用すると、TIMESTAMPTZ値が返されます。これは、::TIMESTAMPを使用してTIMESTAMPにキャストできます。

0
Yankee

私は最近、日付と時刻の変数がVARCHARタイプのテキストとして格納されているデータベースで作業しました複数の異なる形式(質問しないでください...)、それをTIMESTAMPに変換する必要がありましたタイプ。 RedshiftにはTO_TIMESTAMP()関数がないため、私はYiyu Jiaが彼の[ブログ] [1]で提案したトリックを使用しました。一言で言えば、秘訣は

  • tO_DATE()を使用して日付を変換します
  • 上記に入力テキストの時間部分を追加します
  • 結果の文字列をTIMESTAMPにキャストします

たとえば、次のいずれかの形式の日付を持つmyDateという名前のフィールドを処理するスニペットは次のとおりです

  • 「2013年2月8日午後10時6分」
  • 「2007/09/25 16:21:00」

かなり重いですが動作します。正規表現テストは、日付が特定の行で処理される形式に対応するかどうかをテストするために使用されます。 (これは、複数の可能な形式を処理する場合にのみ必要です)
TO_DATE()に送信する前にテキストの時間部分を削除し、追加された時間部分を抽出するために別の正規表現が使用されるため、「Feb 0 2013」の場合は少し複雑です(反対に、同じ目的で使用されるより単純な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
0
mjv