将VARCHAR转换为DATE时返回错误日期的问题求助
解决Vertica中VARCHAR转DATE时日期偏移的问题
这个问题的核心原因是时区转换:你输入的字符串是带UTC时区(+00)的时间,但Vertica默认会使用当前会话的时区来处理日期转换。如果你的会话时区比UTC早(比如UTC-5、UTC-8这类西时区),那么UTC时间2017-12-15 00:11对应到当地时区就是前一天的晚上,转换为DATE类型时自然会得到2017-12-14。
下面是具体的解决方法:
1. 先确认当前会话时区
首先执行这条命令查看你的会话时区设置:
SHOW TIMEZONE;
如果结果不是UTC,那就能直接解释日期偏移的问题了。
2. 转换时强制使用UTC解析
你可以先把字符串转换为带时区的时间戳(TIMESTAMPTZ),再转成DATE类型,这样就能确保用UTC时区来解析:
-- 方法1:使用TO_TIMESTAMP_TZ + TO_DATE SELECT TO_DATE(TO_TIMESTAMP_TZ('2017-12-15 00:11:10.167664+00', 'YYYY-MM-DD HH24:MI:SS.US TZ'), 'YYYY-MM-DD'); -- 方法2:CAST为TIMESTAMPTZ后转DATE SELECT CAST('2017-12-15 00:11:10.167664+00' AS TIMESTAMPTZ)::DATE;
这两种方式都会返回正确的2017-12-15。
3. 临时修改会话时区为UTC
如果你的查询都需要基于UTC处理,可以临时把会话时区改成UTC:
SET TIMEZONE TO 'UTC';
之后再执行你原来的转换语句:
SELECT to_Date('2017-12-15 00:11:10.167664+00', 'YYYY-MM-DD'); SELECT '2017-12-15 00:11:10.167664+00'::date;
就能得到预期的2017-12-15了。
内容的提问来源于stack exchange,提问作者CJR
相关产品推荐
相关产品推荐

