【问题标题】:Oracle timestamp with timezone : replace date portion to current date带时区的 Oracle 时间戳:将日期部分替换为当前日期
【发布时间】:2017-11-04 12:43:12
【问题描述】:

我有一个用于维护截止时间的 oracle 表。在这里,我们存储各种证券的截止时间。目前我们将截止日期部分默认为 1970 年 1 月 1 日。要求是用当前日期替换此日期部分,而不更改截止时间和时区部分。

【问题讨论】:

  • 你能清楚地给出一些示例行和预期的输出吗?
  • @Utsav 截止列(带有时区数据类型的时间戳)数据类似于“1970-01-01 18:00:00 -5:00”。预期输出为“2017-06-03 18:00:09 -5:00”,即今天的日期与截止列的时间戳部分
  • 此请求存在逻辑问题...“日期”定义不明确。应该使用哪个日期? “此时此刻”的日期是 2017 年 6 月 6 日,在美国和欧洲,但在日本和澳大利亚是 2017 年 6 月 7 日。由于您使用的是与 UTC 偏移的时间戳 WITH TIME ZONE,因此从 UTC 中提取当前日期而不是从 SYSDATE 和类似日期中提取当前日期是有意义的。

标签: sql database date timestamp oracle12c


【解决方案1】:

您可以计算从今天到 1970 年 1 月 1 日之间的天数,然后将其作为逐秒间隔添加到您的截止时间戳值中:

create table my_table (cutoff timestamp with time zone);

insert into my_table values (timestamp '1970-01-01 18:00:00 -5:00');

select cutoff + numtodsinterval(trunc(sysdate) - date '1970-01-01', 'DAY') as adjusted
from my_table;

ADJUSTED                           
-----------------------------------
05-JUN-17 18.00.00.000000000 -05:00

或者如果你愿意,你可以直接生成一个区间(正如@mathguy 指出的那样):

select cutoff + (trunc(sysdate) - timestamp '1970-01-01 00:00:00') as adjusted
from my_table;

ADJUSTED                 
-------------------------
06-JUN-17 18:00:00 -05:00

-05:00 时区偏移量当然会忽略夏令时,但这似乎是您想要的。

【讨论】:

  • 这个想法是正确的,但为什么要截断SYSDATE 并减去一个日期,只为结果应用NUMTODSINTERVAL?更好:截断 SYSTIMESTAMP 并减去时间戳文字;结果可以直接添加到CUTOFF
  • 另请参阅我对 OP 要求澄清的说明... 时区时间戳与 UTC 有偏差,因此使用用户系统的“当前日期”似乎不自然(如 @ 所示987654328@或SYSTIMESTAMP);相反,应该先将其转换为 UTC,然后才截断。最好是 OP 确认,因为这不是“编码”问题,而是“问题规范”问题。
  • @mathguy - 不确定它有什么不同,但没关系。 trunc(systimestamp) 仍然给你一个日期(所以它比sysdate 没有太多好处?),但从中减去一个时间戳仍然会给出一个时间间隔。添加了一个版本。我认为第一个更明确一点,但要么需要知道日期时间/间隔算术是如何工作的,这对于很多人来说似乎并不是*8-)
  • @mathguy - 或者实际上是current_datecurrent_timestamp,因为也没有提供系统时间和会话时间之间的区别。但无论如何,是的,同意基于 UTC 是有道理的。
  • 不知道,猜猜他们何时添加了他们忘记或没有(或由于某种原因不能)重载该函数的时间戳数据类型。我认为,传入的时间戳甚至在函数看到它之前就被转换为日期,所以函数本身不会转换它..也许。 round() 也一样。另请注意,既不接受 SS 也不接受任何特定于时间戳的格式元素。
猜你喜欢
  • 1970-01-01
  • 2016-06-07
  • 2023-03-28
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多