Teradata日期时间函数问题:时间格式处理与时区转换
解决方案:处理时间字符串格式与时区转换
核心需求拆解
- 去除时间字符串末尾多余的零(将
2012-6-17 09:50:3.000000转为2012-6-17 09:50:3) - 将美国时区时间转换为本地时区
以下分两种常用SQL环境给出具体实现:
一、SQL Server 实现
1. 去除末尾多余的零
先把字符串转成datetime2类型,再用FORMAT函数按需格式化,自动剔除末尾无用的零:
DECLARE @USATimeStr VARCHAR(50) = '2012-6-17 09:50:3.000000'; -- 转成datetime2后格式化,只保留必要的小数位 SELECT FORMAT(CONVERT(DATETIME2, @USATimeStr), 'yyyy-MM-dd HH:mm:ss.FFFFFF') AS FormattedTime;
如果确认原字符串小数部分全为零,也可以直接转成datetime(仅保留毫秒)再用120格式输出:
SELECT CONVERT(VARCHAR(20), CONVERT(DATETIME, @USATimeStr), 120) AS FormattedTime;
2. 时区转换(以美国东部时间转北京时间为例)
用AT TIME ZONE函数先给原时间绑定美国时区,再转换到本地时区:
DECLARE @USATimeStr VARCHAR(50) = '2012-6-17 09:50:3.000000'; -- 绑定美国东部时区 DECLARE @USATimeOffset DATETIMEOFFSET = CONVERT(DATETIME2, @USATimeStr) AT TIME ZONE 'Eastern Standard Time'; -- 转换到中国标准时间(本地时区) SELECT @USATimeOffset AT TIME ZONE 'China Standard Time' AS LocalTime;
合并操作:格式化+时区转换
DECLARE @USATimeStr VARCHAR(50) = '2012-6-17 09:50:3.000000'; DECLARE @USATimeOffset DATETIMEOFFSET = CONVERT(DATETIME2, @USATimeStr) AT TIME ZONE 'Eastern Standard Time'; SELECT FORMAT(@USATimeOffset AT TIME ZONE 'China Standard Time', 'yyyy-MM-dd HH:mm:ss.FFFFFF') AS FormattedLocalTime;
二、PostgreSQL 实现
1. 去除末尾多余的零
用to_timestamp解析字符串,再结合trim_trailing去掉末尾的零和小数点:
-- 先解析时间,再格式化并去除多余零 SELECT trim_trailing('0' from trim_trailing('.' from to_char(to_timestamp('2012-6-17 09:50:3.000000', 'YYYY-MM-DD HH24:MI:SS.US'), 'YYYY-MM-DD HH24:MI:SS.US'))) AS formatted_time;
2. 时区转换(以美国东部时间转北京时间为例)
用AT TIME ZONE完成时区转换,再格式化输出:
SELECT to_char( to_timestamp('2012-6-17 09:50:3.000000', 'YYYY-MM-DD HH24:MI:SS.US') AT TIME ZONE 'America/New_York' AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD HH24:MI:SS.US' ) AS formatted_local_time;
补充说明
- 你之前尝试的
datepart、current_date函数主要用于提取日期部分或获取当前日期,和字符串格式处理、时区转换的需求不匹配,因此无法解决问题。 - 时区名称需对应数据库支持的列表:SQL Server可通过
SELECT name FROM sys.time_zone_info查看;PostgreSQL可通过SELECT * FROM pg_timezone_names查看。
内容的提问来源于stack exchange,提问作者SHAGUFTA TABREEN
相关产品推荐
相关产品推荐

