- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试让数据库以与机场相同的方式显示日期。例如,如果您在得克萨斯州并且需要搭乘航类前往东海岸,机场侯爵将显示您本地时间的起飞时间和降落时间。因此,例如,从达拉斯飞往纽约的航类将显示该地区的本地时间。
Marquis in Dallas : Takeoff time : 8AM Landing time: 10AM
Marquis in New York: Takeoff time : 9AM Landing time: 11AM
为了做到这一点,我认为数据库会以 UTC 格式存储时间。我知道 TIMESTAMP 没有与之关联的区域 - 但是 - 它确实允许将时间保存到数据库 与区域 附加到它 - 所以 - 我的想法是某种计算会已执行将其转换为 UTC。但是,根据我下面的小测试,这似乎并没有发生。无论我将 SESSION TIME ZONE 设置为什么,日期都保持不变。
TIA
SQL> create table toast ( t timestamp );
Table created.
SQL> insert into toast values ( TIMESTAMP '2019-09-23 16:03:11 US/Eastern');
1 row created.
SQL> select dbtimezone from dual;
DBT
---
UTC
SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
---------------------------------------------------------------------------
-04:00
SQL> select * from toast;
T
---------------------------------------------------------------------------
23-SEP-19 04.03.11.000000 PM
在 session 中更改时区仍然得到相同的日期
SQL> alter session set time_zone = 'America/Chicago';
Session altered.
SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
---------------------------------------------------------------------------
America/Chicago
SQL> select * from toast;
T
---------------------------------------------------------------------------
23-SEP-19 04.03.11.000000 PM
再次更改,结果相同
SQL> alter session set time_zone = 'Pacific/Auckland';
Session altered.
SQL> select * from toast;
T
---------------------------------------------------------------------------
23-SEP-19 04.03.11.000000 PM
改为使用 hours 更改它,得到相同的结果
SQL> SQL> alter session set time_zone = '-3:00';
Session altered.
SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
---------------------------------------------------------------------------
-03:00
SQL> select * from toast;
T
---------------------------------------------------------------------------
23-SEP-19 04.03.11.000000 PM
更新非常感谢@Alex Poole 的详细回复!
我曾使用 Hibernate、Java 和 Oracle,但在使用 Hibernate 保存基于时间的数据时遇到了一些问题(关于这部分,我在这里看到了这篇使用 JAVA Calendar 类格式化解决方案的帖子)。文章在这里:How To Handle Oracle TimeStamp with TimeZone from Java我也看过你之前提到的关于“长篇大论”的论文(以及其他文章)。他们似乎不鼓励使用 TIMESTAMP WITH LOCAL TIMEZONE。只是因为这个信息,我有点想完全坚持使用 TIMESTAMP :-) 但是,还有 TIMESTAMP WITH TIMEZONE 的选项。
你对这个Oracle类型的使用有什么想法吗?
最佳答案
您误解了数据类型。正如您所指出的,时间戳不存储时区,但它也不允许您“将时间保存到附加了区域的数据库”。
当你这样做时:
insert into toast values ( TIMESTAMP '2019-09-23 16:03:11 US/Eastern');
您正在将文字值隐式转换为普通时间戳,就像在做:
insert into toast values ( cast (TIMESTAMP '2019-09-23 16:03:11 US/Eastern' as timestamp ) );
原始区域信息未保留或不可用。没有转换(到 UTC 或其他任何方式),原始时区信息只是被丢弃。
select TIMESTAMP '2019-09-23 16:03:11 US/Eastern',
cast (TIMESTAMP '2019-09-23 16:03:11 US/Eastern' as timestamp )
from dual;
TIMESTAMP'2019-09-2316:03:11US/EASTERN' CAST(TIMESTAMP'2019-09-2316:
--------------------------------------- ----------------------------
23-SEP-19 16.03.11.000000000 US/EASTERN 23-SEP-19 16.03.11.000000000
您的时间戳文字的原始值显示时区; cast 值没有时区信息。
如您所见,更改 session 时区对普通 timestamp
没有影响,因为时区信息没有任何影响。您必须将数据类型设置为 timestamp with time zone
或 timestamp with local time zone
才能产生任何影响。
在您的情况下,您最终将处理不同时区的两个值,仅使用 session 时区并不能真正帮助您。您可以存储出发/到达机场的时区感知时间:
create table toast ( depart timestamp with time zone,
arrive timestamp with time zone);
insert into toast ( depart, arrive )
values ( TIMESTAMP '2019-09-23 08:00:00 US/Central',
TIMESTAMP '2019-09-23 11:00:00 US/Eastern' );
alter session set time_zone = 'UTC';
Session altered.
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 11:00 US/EASTERN
然后调整到本地机场/显示时区 with datetime expressions ,或者明确指定区域:
select to_char(depart at time zone 'US/Central', 'HH24:MI TZR') as depart,
to_char(arrive at time zone 'US/Central', 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 10:00 US/CENTRAL
select to_char(depart at time zone 'US/Eastern', 'HH24:MI TZR') as depart,
to_char(arrive at time zone 'US/Eastern', 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
或者如果您确信这是正确的,则通过本地 session 时区:
alter session set time_zone = 'US/Central';
select to_char(depart at local, 'HH24:MI TZR') as depart,
to_char(arrive at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 10:00 US/CENTRAL
alter session set time_zone = 'US/Eastern';
select to_char(depart at local, 'HH24:MI TZR') as depart,
to_char(arrive at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
虽然将时间存储为 UTC 可能更好,如果您愿意,仍然可以在普通时间戳中完成 - 所以一切都假设存储的值始终是 UTC - 并将原始时间手动或使用 sys_extract_utc()
转换为 UTC :
create table toast ( depart timestamp, arrive timestamp);
insert into toast ( depart, arrive )
values ( sys_extract_utc ( TIMESTAMP '2019-09-23 08:00:00 US/Central' ),
sys_extract_utc ( TIMESTAMP '2019-09-23 11:00:00 US/Eastern' ) );
...
alter session set time_zone = 'US/Eastern';
select to_char(from_tz( depart, 'UTC' ) at local, 'HH24:MI TZR') as depart,
to_char(from_tz ( arrive, 'UTC' ) at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
但包括该地区可能更安全:
create table toast ( depart timestamp with time zone,
arrive timestamp with time zone);
insert into toast ( depart, arrive )
values ( TIMESTAMP '2019-09-23 08:00:00 US/Central' at time zone 'UTC',
TIMESTAMP '2019-09-23 11:00:00 US/Eastern' at time zone 'UTC' );
...
alter session set time_zone = 'US/Eastern';
select to_char(depart at local, 'HH24:MI TZR') as depart,
to_char(arrive at local, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
但是,如果您使用 timestamp with local time zone
,则无论您如何转换输入时间,您都可以更简单地充分利用两者:
create table toast ( depart timestamp with local time zone,
arrive timestamp with local time zone);
insert into toast ( depart, arrive )
values ( TIMESTAMP '2019-09-23 08:00:00 US/Central',
TIMESTAMP '2019-09-23 11:00:00 US/Eastern' at time zone 'UTC' );
alter session set time_zone = 'UTC';
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
13:00 UTC 15:00 UTC
alter session set time_zone = 'US/Central';
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
08:00 US/CENTRAL 10:00 US/CENTRAL
alter session set time_zone = 'US/Eastern';
select to_char(depart, 'HH24:MI TZR') as depart,
to_char(arrive, 'HH24:MI TZR') as arrive
from toast;
DEPART ARRIVE
-------------------------------------- --------------------------------------
09:00 US/EASTERN 11:00 US/EASTERN
(另请阅读 Tony’s Tirade against TIMESTAMP WITH TIME ZONE,了解有关数据类型选项的更多背景信息。)
关于database - session 和数据库的 oracle db 时区, session 区域的更改不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45436049/
Oracle 即时客户端和 Oracle 客户端有什么区别?你能给我解释一下吗?谢谢 最佳答案 Oracle 客户端带有安装程序和许多可执行文件,例如 sqlplus,tnsping,它是完整而庞大的
我正在寻找一个Delphi组件来直接连接到ORACLE数据库服务器,而无需安装oracle客户端。 我知道Oracle Data Access (ODAC)来自DevArt 。还有其他组件具有此功能吗
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
如何编写 Oracle 存储过程,以表 (X) 作为输入参数,并在过程内部使用表 X 来与另一个表 Y 联接? 表 X 将包含数千条记录。 不希望将表名作为 varchar 传递,然后使用动态 SQL
我要过滤COMMENTS属性为空的记录 我试过了 SELECT TABLE_NAME, COMMENTS FROM (SELECT TABLE_NAME, COMMENTS FROM (sel
我要下载 Oracle Instant Client for Linux x86-64 (64-bit)现在有一段时间了。 现在我注意到该网站在过去几个月中一直遇到技术问题。 要从 Oracle 下载
有什么方法可以将我的 Delphi 应用程序 (FireDac) 直接连接到 Oracle 数据库? 目前可以连接,但需要安装Oracle Client 在 embarcadero 站点 ( http
我有一张表,其中日期列的数据格式如下:“7/25/2014 12:14:27 AM”。我需要通过放入 where 子句来获取此日期。有人可以建议我该怎么做吗? 最佳答案 日期(存储在表中)是 repr
如果两个事务试图同时修改同一行会发生什么?通常,一旦行被修改,另一个事务等待直到第一个事务执行提交或回滚。但是,如果他们恰好在同一时刻发送更新请求怎么办? 最佳答案 答案是否定的。两个事务不能同时修改
我想知道为什么我不能在 Oracle 模式中有两个同名的索引?它抛出一个错误,指出该名称已被使用。我的印象是,由于索引在一个特定的表上,这应该不会导致任何错误,除非我们对同一个表上的两个不同列使用相同
我需要构建一个查询来按成员和到期日期检索信息组,但我需要为每个成员提供一个序列号.. 例如: 如果成员“A”有 3 条记录要过期,“B”只有 1 条,“C”有 2 条,我需要这样的结果: Number
独立程序 create procedure proc1 ( begin end; ) 存储过程 create package pkg1 ( procedure proc2 begin end; ) 最
在 Oracle 9i 中声明 FK 时遇到问题。我在这里查看了许多关于 SO 和一些在线文档(例如 http://www.techonthenet.com/oracle/foreign_keys/f
我和我的同事维护的应用程序在后端有一个 Oracle 数据库。我们正在考虑偶尔以“受限”模式运行应用程序,其中一个数据库表空间设置为只读。我们可以轻松地将必要的表和索引移动到单独的表空间,这些表空间将
我想实现一个自定义的回归聚合函数,类似于现有的 REGR_SLOPE . 我要定义的函数需要获取两列作为参数,例如 select T.EMPLOYEE_ID, CUSTOM_REGR_SL
我已经尝试解决这个问题一段时间了,我认为是时候寻求帮助了。我正在构建一个架构配置脚本,我想添加一些脚本输出和错误处理。这个想法是脚本输出窗口只会向我显示关键消息而没有所有噪音。 Create Temp
在旧的 Oracle 服务器(我被告知是 8i)上使用 JDBC 时,我遇到了一个非常令人困惑和奇怪的问题。我在那里准备了一个表,其中包含大约 10 列、数字、varchars、一个 raw(255)
我有一张 table Customer_Chronics在 Oracle 11g 中。 该表具有三个关键列,如下所示: 分支代码 客户 ID 期 我已按 branch_code 列表按表分区,现在我进
是否有存储用户自定义异常的oracle表? 最佳答案 没有。 与其他变量一样,用户定义的异常在 PL/SQL block 中定义,并且具有 PL/SQL 变量将具有的任何范围。所以,例如 DECLAR
在 oracle 中使用序列并使用 Before insert trigger 自动递增列或使用标识列是否更好,因为它在 Oracle 12 c 中可用? 最佳答案 无论哪种方式,您都将使用序列。 1
我是一名优秀的程序员,十分优秀!