Snowflake中VARCHAR转YYYYMMDD格式日期的问题排查
解决VARCHAR日期字段转换为YYYYMMDD格式的问题
你的问题出在解析原字符串时用错了格式掩码——原字段中的值是12/1/2018 12:00:00 AM这种MM/D/YYYY HH12:MI:SS AM格式的字符串,而你指定的YYYYMMDD格式掩码和它完全不匹配,自然会解析失败(用TO_DATE会报错)或者返回NULL(用TRY_TO_DATE)。
解决思路分两步:
- 先使用和原字符串匹配的格式掩码,把VARCHAR字段解析为DATE类型
- 再将DATE类型格式化为
YYYYMMDD格式的字符串(或者保留DATE类型,按需调整显示格式)
具体SQL示例
假设你的原字符串都是MM/D/YYYY HH12:MI:SS AM格式(支持单个数字的日/月),可以用以下语句:
SELECT START_DATE AS START_DATE_ORIG, -- 转换为YYYYMMDD格式的字符串 TO_CHAR(TRY_TO_DATE(START_DATE, 'MM/D/YYYY HH12:MI:SS AM'), 'YYYYMMDD') AS START_DATE_YYYYMMDD, -- 转换为DATE类型(存储为日期,可后续按需格式化) TRY_TO_DATE(START_DATE, 'MM/D/YYYY HH12:MI:SS AM') AS START_DATE_DATE_TYPE FROM MY_TABLE;
处理多种格式的情况
如果你的START_DATE字段存在多种格式(比如有的值只有日期MM/DD/YYYY,有的带时间),可以给TRY_TO_DATE传入多个格式掩码,它会自动匹配尝试:
SELECT START_DATE AS START_DATE_ORIG, TO_CHAR(TRY_TO_DATE(START_DATE, 'MM/D/YYYY', 'MM/DD/YYYY', 'MM/D/YYYY HH12:MI:SS AM'), 'YYYYMMDD') AS START_DATE_YYYYMMDD FROM MY_TABLE;
注意:如果用
TO_DATE代替TRY_TO_DATE,遇到不匹配的格式会直接报错,所以建议用TRY_TO_DATE来兼容格式不统一的情况,避免查询中断。
内容的提问来源于stack exchange,提问作者user21904091
相关产品推荐
相关产品推荐

