【问题标题】:Convert text to timestamp in redshift在红移中将文本转换为时间戳
【发布时间】:2015-10-16 15:32:38
【问题描述】:

我有一个带有文本值的文本字段“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 格式的方法。

提前感谢您解决此问题

【问题讨论】:

  • 你尝试过 COVERT ... 作为时间戳吗?请注意,最好将转换作为 COPY 命令的一部分而不是查询的一部分。

标签: amazon-redshift to-date to-timestamp


【解决方案1】:
cast(column as timestamp)

在红移上为我工作。见http://devdocs.io/postgresql~9.4/sql-expressions#SQL-SYNTAX-TYPE-CASTS

【讨论】:

    【解决方案2】:

    尝试转换功能:

    convert(timestamp,presence_changed_at)
    

    【讨论】:

    • 感谢CONVERT()的建议;但是,此函数仅在字符串采用主机隐含的格式(默认字符串格式)时才有效。我想找到类似于TO_TIMESTAMP() 的东西,以便我可以传递任意日期格式。
    【解决方案3】:

    在没有子选择的情况下从红移中的 unixtime 获取日期时间令人惊讶地可怕。但是,您可以这样做:

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

    【讨论】:

    • 如果您的时间都以 UTC 格式存储并且您不使用 TIMESTAMPTZ 列,您也可以使用 TIMESTAMP
    【解决方案4】:

    请使用TO_Timestamp("presence_changed_at",'YYYY/MM/DD HH24:MI:SS') 获得所需的输出

    【讨论】:

    • 有帮助,但它附加了一个 +00,因为它是 TIMESTAMPTZ 数据类型 - 如果我的数据不是 UTC 怎么办? +00 具有误导性。
    【解决方案5】:

    您可以将其转换为时间戳。这支持相当多的合理格式,而无需指定。

    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
    

    【讨论】:

      【解决方案6】:

      以下功能对我有效...使用适合您的功能...

      cast(column_name 作为时间戳)

      to_date(column_name,'MM/DD/YYYY HH24:MI:SS')

      to_date(column_name,'MM/DD/YYYY HH12:MI:SS')

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

      【讨论】:

        【解决方案7】:

        截至今天,redshift 支持 to_timestamp。因此,您的 SQL 查询应该可以工作。检查http://docs.aws.amazon.com/redshift/latest/dg/r_TO_TIMESTAMP.html

        【讨论】:

          【解决方案8】:

          使用TO_TIMESTAMP(presence_changed_at,'YYYY/MM/DD HH24:MI:SS') 将返回一个TIMESTAMPTZ 值,可以使用::TIMESTAMP 将其转换为TIMESTAMP

          【讨论】:

            【解决方案9】:

            我最近在一个数据库中工作,其中日期和时间变量以文本形式存储为 VARCHAR 类型,以多种不同格式(不要问...),并且必须对其进行转换到 TIMESTAMP 类型。 由于 Redshift 中没有 TO_TIMESTAMP() 功能,我使用了 Yiyu Jia 在他的 [blog][1] 上提出的技巧。简而言之,诀窍是

            • 使用 TO_DATE() 获取转换后的日期
            • 将输入文本的时间部分附加到上面
            • 将结果字符串转换为 TIMESTAMP

            例如,这里的 sn-p 用于处理名为 myDate 的字段,其日期采用以下任一格式

            • “2013 年 2 月 8 日晚上 10:06”
            • “25/09/2007 16:21:00”

            它很重,但很有效。正则表达式测试用于测试日期是否对应于给定行上处理的格式。 (仅在处理多种可能的格式时才需要)
            “2013 年 2 月 0 日”的情况有点复杂,因为我在将文本提交到 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
            

            【讨论】:

            • 放入案例会对性能产生严重影响。正则表达式具有严重的性能和正确性影响。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-06
            • 2019-08-15
            • 2018-07-23
            • 2016-01-14
            • 2020-02-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多