13

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

提前感谢您解决此问题

4

9 回答 9

9
cast(column as timestamp)

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

于 2017-11-17T15:41:14.547 回答
3

尝试转换功能:

convert(timestamp,presence_changed_at)
于 2015-09-02T12:31:59.340 回答
3

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

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

于 2016-05-10T23:05:12.700 回答
2

Use TO_TIMESTAMP(presence_changed_at,'YYYY/MM/DD HH24:MI:SS')which 将返回一个TIMESTAMPTZ值,该值可以强制转换为TIMESTAMPusing ::TIMESTAMP

于 2020-02-13T08:22:18.613 回答
2

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

于 2016-06-01T09:28:18.877 回答
2

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

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
于 2016-06-22T19:03:49.613 回答
2

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

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')

于 2018-11-08T19:40:47.243 回答
1

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

于 2017-01-23T10:20:59.637 回答
0

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

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

例如,这是处理名为 myDate 的字段的代码段,其中日期采用以下任一格式

  • “2013 年 2 月 8 日晚上 10: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
于 2016-04-03T06:12:04.943 回答