Oracle数据库中如何区分UTC时间戳列与非UTC时间戳列
嘿,我懂你的困扰——单纯用data_type like '%TIME%'筛选肯定不够,因为DATE、TIMESTAMP这类数据类型本身并不自带“是否为UTC”的标识,UTC是业务层面的约定,得从命名、注释或者类型特性入手。下面给你几个实用的思路:
利用团队命名规范查询
很多开发团队会给UTC时间戳列统一命名,比如加_utc后缀(比如created_at_utc、updated_ts_utc)。你可以用这个规则精准筛选:SELECT owner, table_name, column_name, data_type FROM all_tab_columns WHERE data_type IN ('TIMESTAMP', 'TIMESTAMP WITH TIME ZONE', 'DATE') AND column_name LIKE '%_utc';当然,不同团队的命名习惯可能不一样,你可以根据实际情况调整通配符,比如
%utc%或者%_ts_utc。筛选带时区的时间类型
如果你的数据库支持带时区的时间类型(比如Oracle的TIMESTAMP WITH TIME ZONE),这类列有可能存储的是UTC时间(取决于业务约定)。你可以先把这类列找出来再确认:SELECT owner, table_name, column_name, data_type FROM all_tab_columns WHERE data_type LIKE '%TIMESTAMP%TIME ZONE%';注意:
TIMESTAMP WITH LOCAL TIME ZONE会自动转换为数据库时区,所以如果业务要求存UTC,一般会用TIMESTAMP WITH TIME ZONE并明确存储UTC时区。通过列注释查找
要是你的团队有给列加注释的好习惯,很多UTC时间列的注释里会明确标注“UTC”。你可以关联注释表查询:SELECT tc.owner, tc.table_name, tc.column_name, tc.data_type, cc.comments FROM all_tab_columns tc JOIN all_col_comments cc ON tc.owner = cc.owner AND tc.table_name = cc.table_name AND tc.column_name = cc.column_name WHERE tc.data_type IN ('TIMESTAMP', 'DATE', 'TIMESTAMP WITH TIME ZONE') AND cc.comments LIKE '%UTC%';
最后补充一句:你之前的查询select * from all_tab_columns where data_type like '%TIME%'会把INTERVAL DAY TO SECOND这类非时间戳的类型也包含进来,所以最好限定具体的时间类型(比如上面的DATE、TIMESTAMP相关类型),结果会更精准。
内容的提问来源于stack exchange,提问作者John Wick

