【发布时间】:2021-08-12 12:51:33
【问题描述】:
我要求 Oracle 告诉我当地时间下周一中午 12:00 时圣地亚哥的日期和时间。
以下SQL:
SELECT to_timestamp(
to_char(trunc(next_day(sysdate, 1)) + 0.5,
'DD-MM-YY HH24:MI'))
AT TIME ZOME 'America/Santiago'
FROM dual;
返回:16-08-21 06:00:00,000000000 AMERICA/SANTIAGO
我想提取日期、小时和分钟,所以我这样做:
SELECT to_char(
to_timestamp(
to_char(trunc(next_day(sysdate,1)) + 0.5,
'DD-MM-YY HH24:MI'))
AT TIME ZONE 'America/Santiago',
'DD-MM-YY HH24:MI')
FROM dual;
返回:16-08-21 07:00
谁能解释一下为什么 06:00 在转换为_char 时变成 07:00 ?!
提前致谢
【问题讨论】:
-
一个错误很明显;它可能会也可能不会解释您观察到的情况。在您的公式中,您有
to_timestamp(to_char(.......)),但您只有一种格式模型 - 与to_char一起使用。您没有to_timestamp的格式模型。字符串格式为dd-mm-yy hh24:mi;但如果您的nls_timestamp_format不同,则可能会导致问题。现在,问你一个问题:你想知道如何正确地做到这一点,或者你想知道具体是什么导致了你观察到的差异? -
另请注意,使用数字作为第二个参数调用
next_day是未记录的。你不应该依赖它来进行严肃的工作。 -
@mathguy 感谢您的回复。不幸的是,为 to_timestamp 添加格式模型并没有产生任何影响。我很想知道是什么导致了这种差异,因为这是我看到这种行为的大约 15 个时区列表中的唯一示例。但是,如果有更好的方法来解决我的问题,那就太好了。我这样做的原因是因为我们的应用程序使用了一个数据库表,该表表示不同地区的 GMT 偏移量。随着 DST 的变化,我们想用这个 SQL 来监控。
-
作为一个侧面观察,为什么您在所有格式模型中都使用 2 位数年份 ('YY')?你没听说过一个叫做“千年虫问题”的小东西吗?
-
如果你去掉内部(不必要的)
to_char,你还会得到这个差异吗?
标签: oracle timestamp-with-timezone