Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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 如何查看数据库中哪些时间戳列是UTC时间戳,哪些不是';甲骨文中的t_Sql_Oracle - Fatal编程技术网

Sql 如何查看数据库中哪些时间戳列是UTC时间戳,哪些不是';甲骨文中的t

Sql 如何查看数据库中哪些时间戳列是UTC时间戳,哪些不是';甲骨文中的t,sql,oracle,Sql,Oracle,我想我看到了一个查询,它显示了哪些列是utc,哪些列不是utc,但我没有看到这个查询,我似乎无法在网上找到它。。。下面是我试过的,提前谢谢 select * from all_tab_columns where data_type like '%TIME%' Oracle提供了两种处理时区的数据类型: 带时区的时间戳和带本地时区的时间戳 然而,这些只是处理时区的数据类型,并不意味着存储的值是UTC时间。通常,它们可以是任何时区,但如果需要,您可以将它们转换为UTC 你的疑问是 select *

我想我看到了一个查询,它显示了哪些列是utc,哪些列不是utc,但我没有看到这个查询,我似乎无法在网上找到它。。。下面是我试过的,提前谢谢

select * from all_tab_columns
where data_type like '%TIME%'

Oracle提供了两种处理时区的数据类型:

带时区的时间戳
带本地时区的时间戳

然而,这些只是处理时区的数据类型,并不意味着存储的值是UTC时间。通常,它们可以是任何时区,但如果需要,您可以将它们转换为UTC

你的疑问是

select * 
from all_tab_columns
where data_type like 'TIMESTAMP(%) WITH% TIME ZONE';
关于您的评论的附录:

TIMESTAMP
DATE
列中,您没有时区,因此无法查询任何内容

在带有本地时区的
时间戳上
时间总是
SESSIONTIMEZONE
返回,内部存储在
DBTIMEZONE
,因此查询没有任何意义

在带有时区的时间戳上,您可以运行如下查询:

select timestamp_tz_column
from your_table
where TO_CHAR(timestamp_tz_column, 'TZR') in ('UTC', 'GMT', '+00:00');
-- or 
where EXTRACT(TIMEZONE_REGION FROM timestamp_tz_column) in ('UTC', 'GMT', '+00:00');
-- or 
where EXTRACT(TIMEZONE_HOUR FROM timestamp_tz_column) = 0 
  AND EXTRACT(TIMEZONE_MINUTE FROM timestamp_tz_column) = 0;

但实际上,这个查询也是无用的,因为您可以在时区“UTC”转换值,如
timestamp\u tz\u列
SYS\u EXTRACT\u UTC(timestamp\u tz\u列)

请澄清您的意思。Oracle有两种处理时区的数据类型。一种是带有时区的时间戳。这里,时区是数据的一部分;同一表中、同一列中具有此数据类型的不同行可能具有不同的时区组件。所以这个问题对于这种数据类型没有意义;时区分别应用于每个值,而不是列。另一种数据类型是带有本地时区的时间戳。这里,每个带有时区的时间戳都转换为UTC。生成的时间戳存储时没有时区信息,但数据类型指示该时间戳表示的内容。您的意思是,如何找到所有具有此数据类型的列?这很简单-查询
USER\u TAB\u COLUMNS
或类似内容,并筛选数据类型。不,我想知道的是,是否有一种方法可以让我们知道各个列中的时间戳是UTC还是必须转换。您是指数据类型
TIMESTAMP
的列吗?意思是,不是那些与时区有关的类型?你想知道是否有一种方法可以判断时间戳是否应该是UTC而不是Sydney,例如?Oracle数据库中没有这样的标记;如果您需要它,它必须在表的注释中,创建表语句的文档(或整个项目的规范)中,或者-糟糕的做法-在列名中编码,等等。这就是带时区的时间戳存在的原因!对于带有本地时区的时间戳,您所说的不正确。该数据类型始终具有UTC时间戳。查询时会将其转换为会话本地时区(插入表时会将其从本地时区转换为UTC)。@mathguy,否,
带有本地时区的时间戳
值存储在
DBTIMEZONE
中。但是,Oracle建议将DBTIMEZONE设置为UTC,因此您的语句并没有完全错误。LOL-是的,DBTIMEZONE=UTC非常常见,以至于我忘记了它实际上是DBTIMEZONE。但我的主要观点是,带有本地时区的时间戳存储值不能是“任何时区”。它们都在相同的预定时区DBTIMEZONE(不是UTC,如果DBTIMEZONE设置为UTC以外的值,正如您指出的那样)。@mathguy,当然,时间戳存储在预定时区(DBTIMEZONE)但从用户的角度来看,它总是出现在
SESSIONTIMEZONE
——可以是任何时区。也许现在它会变成哲学。要点是:数据类型
带时区的时间戳
带本地时区的时间戳
处理时区,所有其他数据类型都不处理。关于“UTC或非UTC”,您已经在上面提供了一些有效的评论。您提出了OP必须记住的一个重要区别:在带有本地时区的时间戳的情况下,“存储”时区(没有,但暗示为DBTIMEZONE)和“显示”时区之间。或者也许OP不在乎,因为这似乎不是他们的问题;这仍然是一个重要的区别!