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