Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取用户在其时区提交的时间_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 获取用户在其时区提交的时间

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

当用户提交数据时,我们的应用程序使用当前时间戳存储事件。这存储在带有本地时区的时间戳列中。我们的服务器在PST时区,但我想看看澳大利亚的一个用户在澳大利亚时间什么时候提交数据?我不知道如何正确地做到这一点?当我现在查询数据库时,这列似乎显示了提交行的日期,但每行都是PST时间

大概是这样的:

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
设置