使用带时区的时间戳提取日期

Posted

技术标签:

【中文标题】使用带时区的时间戳提取日期【英文标题】:Extract Date with a Timestamp with timezone 【发布时间】:2018-09-18 04:52:30 【问题描述】:

如何将以下时间戳转换为简单日期?

Thu Nov 29 18:00:00 CST 2018
Thu Apr 26 01:00:00 BST 2018

【问题讨论】:

欢迎来到***!!! 请具体说明“转换”是什么意思。您是将这些存储在时间戳列中还是存储为字符串? 对你来说什么是简单的约会?问是因为我不认为这是 Oracle SQL 中已知的概念。 【参考方案1】:

如果您将空格分隔的值假定为数组,则此代码实际上按空格拆分数据并从指定索引中提取值。 然后将其合并并转换为日期格式

SELECT to_date(
       REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 3)  ||' '||
       REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 2)  ||' '||
      REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 6),'DD-MM-YYYY' )
FROM dual ;

你也可以这样使用:

SELECT to_date(
       REGEXP_SUBSTR(columnname, '[^ ]+', 1, 3)  ||' '||
       REGEXP_SUBSTR(columnname, '[^ ]+', 1, 2)  ||' '||
      REGEXP_SUBSTR(columnname, '[^ ]+', 1, 6),'DD-MM-YYYY' )
FROM tablename;

从您的 cmets 更新代码以添加 HH:MM AM/PM cst/gst:

SELECT to_char(to_timestamp(
       REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 3)  ||' '||
       REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 2)  ||' '||
       REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 6)  ||' '||
       REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 4)
      ,'DD-MM-YYYY hh24:mi:ss' ),'DD-MM-YYYY HH:MI AM'  )||' '||
       REGEXP_SUBSTR('Thu Nov 29 18:00:00 CST 2018', '[^ ]+', 1, 5)     
FROM dual ;

注意:只有当您的列中的所有数据都采用上述格式时,这才有效。

输出将是一个简单的日期,如下所示:'29-11-2018' 如果您希望输出为“29-NOV-2018”,您可以将代码替换为“DD-MON-YYYY”

【讨论】:

如果我想在提取的日期中添加格林威治标准时间上午 8:00 怎么办?【参考方案2】:

这将起作用:

select trunc(systimestamp), systimestamp from dual; 

也可以使用:

Select to_char(to_date('15-JUN-16 22:54:39','DD-MON-YY 
HH24:MI:SS'),'DD-MON-YY') from dual;

【讨论】:

以上是关于使用带时区的时间戳提取日期的主要内容,如果未能解决你的问题,请参考以下文章

数据类型“带时区的时间戳”中的时区存储

在带有/不带时区的日期或时间戳的查询中处理 generate_series()

如何使用 JPA 和 Hibernate 在 UTC 时区中存储日期/时间和时间戳

Postgres 通过时区转换防止时间戳

如何从java中的字符串时间戳中提取日期和时间

Redshift:将时间戳转换为特定时区的日期