当前位置: 首页 > 知识库问答 >
问题:

将Unix纪元转换为Oracle SQL中带有时区的日期/时间戳

和丰羽
2023-03-14

我试图编写一个SQL表达式,该表达式将在特定时区将unix历元(1970/1/1以来的秒)转换为本地时间,并从中提取小时值。在研究了这段时间的解决方案后,我仍然不确定如何处理时区。注意,我尽量避免使用NEW_TIME()函数,因为它只使用时区缩略词的有限子集,而不使用全时区名称。

select 
(TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' + numtodsinterval(1464820200,'second')) as ts_utc,
(TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'America/Los_Angeles' + numtodsinterval(1464820200,'second')) as ts_la,
(DATE '1970-01-01' + numtodsinterval(1464820200,'second')) as date_utc,
FROM_TZ(CAST(DATE '1970-01-01' + numtodsinterval(1464820200,'second') as TIMESTAMP), 'UTC') AT TIME ZONE 'America/New_York' as date_ny,
FROM_TZ(CAST(DATE '1970-01-01' + numtodsinterval(1464820200,'second') as TIMESTAMP), 'UTC') AT TIME ZONE 'America/Los_Angeles' as date_la, -- this value is correct
EXTRACT(hour from FROM_TZ(CAST(DATE '1970-01-01' + numtodsinterval(1464820200,'second') as TIMESTAMP), 'UTC') AT TIME ZONE 'America/New_York') as hour,
EXTRACT(TIMEZONE_OFFSET from FROM_TZ(CAST(DATE '1970-01-01' + numtodsinterval(1464820200,'second') as TIMESTAMP), 'UTC') AT TIME ZONE 'America/New_York') as tz_offset,
NEW_TIME((DATE '1970-01-01' + numtodsinterval(1464820200,'second')), 'GMT', 'EDT') as date_edt -- this value is correct
from dual;

结果是

TS_UTC  TS_LA   DATE_UTC    DATE_NY DATE_LA HOUR    TZ_OFFSET   DATE_EDT
2016-06-01 23:30:00.0   2016-06-01 23:30:00.0   2016-06-01 22:30:00.0   2016-06-01 15:30:00.0   2016-06-01 15:30:00.0   22  <UnknownType (-104)>    2016-06-01 18:30:00.0

结果有几个问题

  1. 第1列:从时间戳开始,该值比使用日期关闭1小时
  2. 第2列:在America/los_Angeles中创建此时间戳产生的值与UTC中的值相同
  3. 第4列:将时间戳转换为America/New_York生成的值与America/Los_Angeles中的值相同
  4. 第6列:提取的小时是第3列的UTC小时
  5. 第7列:不能将时区偏移量提取为全部,导致类型未知

共有1个答案

柴霖
2023-03-14

我想出了一个或多或少有点古怪的解决方案--使用TO_CHAR()函数先将其转换为string,然后将string转换为Number。

TO_NUMBER(TO_CHAR(FROM_TZ(CAST(DATE '1970-01-01' + numtodsinterval(1464820200,'second') as TIMESTAMP), 'UTC') AT TIME ZONE 'America/New_York', 'HH24')) as date_ny_int

在时区的FROM_TZ()也能正常工作,但是SQL工具(甚至是基于JDBC的工具)将输出一个本地化到本地时区的字符串;因此也应该使用TO_CHAR()转换为字符串输出。

 类似资料:
  • 上下文是,我们的产品中有一个现有的应用程序,它生成并向现有的oracle过程发送纪元号&反之亦然。它在该过程中使用如下内容 当我尝试这些查询时,它对我也适用于Oracle10g服务器(如果有关系的话,还有Oracle sql Developer4.x)。 在现有的过程中,要求将值保存为日期本身(时间组件与日期无关),但是在新的要求中,我必须将unix EPOCH值转换为日期时间(小时/分钟/秒级别

  • 问题内容: 我目前在使用Python时遇到问题。我有一个Pandas DataFrame,列之一是带有日期的字符串。格式为: “%Y-%m-%d%H:%m:00.000”。例如:“ 2011-04-24 01:30:00.000” 我需要将整列转换为整数。我尝试运行此代码,但是它非常慢,并且有几百万行。 你们知道如何将整个列转换为纪元时间吗? 提前致谢 ! 问题答案: 将字符串转换为using ,

  • 问题内容: 我有包含Java应用程序中的Unix时间戳的Excel文档。我想看看它们翻译成什么,并在Excel中将其表示为人类可读的日期。 例如,以下long: 1362161251894的 求值 结果 应类似于: 2013年3月1日11:07:31,894 我假设可以为此创建一个公式,但不确定如何。谢谢! 问题答案: 是的,您可以创建一个公式来为您执行此操作。Java和Unix / Linux计

  • 如何在Spring boot2中用MongoDB将日期转换为纪元(unix时间戳)?

  • 我有一个UTC时间,我想知道从epoch开始的秒数。 我正在使用strftime将其转换为秒数。以2012年4月1日为例。 2012年4月1日,来自epoch的UTC为1333238400,但上面返回的是1333234800,相差1小时。 因此,看起来strftime正在考虑我的系统时间,并在某个地方应用时区偏移。我以为约会时间纯粹是天真的? 我该如何解决这个问题?如果可能,除非是标准的,否则避免