Sql 获取用户在其时区提交的时间
当用户提交数据时,我们的应用程序使用当前时间戳存储事件。这存储在带有本地时区的时间戳列中。我们的服务器在PST时区,但我想看看澳大利亚的一个用户在澳大利亚时间什么时候提交数据?我不知道如何正确地做到这一点?当我现在查询数据库时,这列似乎显示了提交行的日期,但每行都是PST时间 大概是这样的:Sql 获取用户在其时区提交的时间,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,当用户提交数据时,我们的应用程序使用当前时间戳存储事件。这存储在带有本地时区的时间戳列中。我们的服务器在PST时区,但我想看看澳大利亚的一个用户在澳大利亚时间什么时候提交数据?我不知道如何正确地做到这一点?当我现在查询数据库时,这列似乎显示了提交行的日期,但每行都是PST时间 大概是这样的: SELECT datetime_submitted -- I want this to display the time this value was created in Australian time
SELECT
datetime_submitted -- I want this to display the time this value was created in Australian time not PST
FROM my_table
WHERE user = 'AUSTRALIAN';
如果您只想查看用户时区中的时间,则可以将会话设置为用户所在的任何时区,然后当您选择时间时,会话将在该时区中返回给您,就像您是该用户一样
% setenv ORA_SDTZ '+09:30'
或
有关更多详细信息,请参阅:
已更新
如果您只希望在不同的时区中显示一列,则可以对其进行转换
要仅在查询中转换时区,您只需在要更改的列上使用时区“US/Eastern”作为时间名称的CAST(日期字段作为时间戳)
参考了解更多详细信息:如果您只想查看用户时区中的时间,您可以将会话设置为用户所在的任何时区,然后在选择时间时,它会在该时区将会话返回给您,就像您是该用户一样
% setenv ORA_SDTZ '+09:30'
或
有关更多详细信息,请参阅:
已更新
如果您只希望在不同的时区中显示一列,则可以对其进行转换
要仅在查询中转换时区,您只需在要更改的列上使用时区“US/Eastern”作为时间名称的CAST(日期字段作为时间戳)
参考了解更多详细信息:首先,您的应用程序需要使用用户本地时区接收准确的日期时间。例如,如果您有一个带有前端、后端和数据库的典型web应用程序,那么前端需要将带有本地用户时区的准确日期时间(例如“2016-08-08 03:00:00CST”)发送到后端。后端需要将其保存在一个表中,以便保存从前端接收的日期、时间和时区信息。Oracle需要将日期、时间和时区存储到数据库中,因为提交的datetime\u
列应该包含有关时区的信息。适合它的数据类型将是带有时区的时间戳,如下所述:首先,您的应用程序需要接收带有用户本地时区的准确日期时间。例如,如果您有一个带有前端、后端和数据库的典型web应用程序,那么前端需要将带有本地用户时区的准确日期时间(例如“2016-08-08 03:00:00CST”)发送到后端。后端需要将其保存在一个表中,以便保存从前端接收的日期、时间和时区信息。Oracle需要将日期、时间和时区存储到数据库中,因为提交的datetime\u
列应该包含有关时区的信息。适用于它的数据类型为带时区的时间戳,如下所述:使用AT TIME ZONE子句:
select systimestamp as server_timestamp,
systimestamp at time zone 'Australia/Sydney' as australia_timestamp
from dual;
SERVER_TIMESTAMP AUSTRALIA_TIMESTAMP
-------------------------------------- --------------------------------------
12-AUG-16 04.12.23.789000000 PM -05:00 13-AUG-16 07.12.23.789000000 AM AUSTRALIA/SYDNEY
现在是2016年8月12日下午4:12:23,在我所在地(美国中部时间);从例子中可以看出,澳大利亚已经是明天了。(这让我想起了一个笑话——不要担心今天世界末日的到来,澳大利亚已经是明天了!)使用时区条款:
select systimestamp as server_timestamp,
systimestamp at time zone 'Australia/Sydney' as australia_timestamp
from dual;
SERVER_TIMESTAMP AUSTRALIA_TIMESTAMP
-------------------------------------- --------------------------------------
12-AUG-16 04.12.23.789000000 PM -05:00 13-AUG-16 07.12.23.789000000 AM AUSTRALIA/SYDNEY
现在是2016年8月12日下午4:12:23,在我所在地(美国中部时间);从例子中可以看出,澳大利亚已经是明天了。(这让我想起了一个笑话-不要担心今天世界末日的到来,澳大利亚已经是明天了!)也许您没有完全理解带有本地时区的数据类型时间戳。带有本地时区的数据类型时间戳
始终且仅显示当前用户会话时区中的时间值
当您使用时区时,通常会收到这样的建议:“将所有时间存储在UTC时间,并在应用程序层转换显示的值。”这正是时间戳与本地时区
的工作原理。主要区别在于,时间不是存储在UTC
上,而是存储在DBTIMEZONE
(当然,除非您设置DBTIMEZONE=UTC)。因此,一旦在带有本地时区的时间戳
列中有任何数据,就不能修改DBTIMEZONE
设置
例如,如果您尝试将转换为\u CHAR(datetime\u submitted,'hh24:mi:ss TZR')
,则会出现错误,因为根据定义,时区区域始终是您当前用户会话的时区
数据库不知道您在澳大利亚用户的时区,因为所有存储的时间都转换为PST时区(很可能是-08:00
,但跳过此处的详细信息)
如果希望在不同的时区中查看值,则必须更改当前用户会话时区。通常通过ALTER SESSION SET TIME_ZONE=…
或通过环境变量分别执行。注册表设置ORA\u SDTZ
另一种解决方案是转换为带有时区的时间戳
或时间戳
数据类型。可能您没有完全理解带有本地时区的数据类型时间戳
。带有本地时区的数据类型时间戳
始终且仅显示当前用户会话时区中的时间值
当您使用时区时,通常会收到这样的建议:“将所有时间存储在UTC时间,并在应用程序层转换显示的值。”这正是时间戳与本地时区
的工作原理。主要区别在于,时间不是存储在UTC
上,而是存储在DBTIMEZONE
(当然,除非您设置DBTIMEZONE=UTC)。因此,一旦在带有L的时间戳中有任何数据,就不能修改DBTIMEZONE
设置