为何特定datetime字符串使用cast无法转换为date类型
问题根因
这是SQL默认的日期解析格式不匹配导致的:
- 绝大多数数据库默认采用
MM/DD/YYYY(月/日/年)的美式规则解析斜杠分隔的日期字符串 - 第一条语句的
'3/11/2021'可以被解析为2021年3月11日,月、日数值都在合法范围内,所以转换成功 - 第二条语句的
'26/02/2021'按默认美式规则解析时,会把开头的26识别为月份,而月份合法取值仅为1~12,数值超出范围导致转换失败
修复方案
如果你的日期字符串是DD/MM/YYYY(日/月/年)格式,不要依赖默认隐式转换规则,显式指定解析格式即可避免歧义,不同数据库对应写法参考:
- MySQL:
SELECT STR_TO_DATE('26/02/2021 12:00:00 AM', '%d/%m/%Y %h:%i:%s %p') AS target_date;
- SQL Server:
SET DATEFORMAT DMY; SELECT CAST('26/02/2021 12:00:00 AM' AS DATE); -- 或者用CONVERT显式指定格式 SELECT CONVERT(DATE, '26/02/2021 12:00:00 AM', 103);
- Oracle:
SELECT TO_DATE('26/02/2021 12:00:00 AM', 'DD/MM/YYYY HH:MI:SS AM') FROM DUAL;
- PostgreSQL:
SELECT TO_DATE('26/02/2021 12:00:00 AM', 'DD/MM/YYYY HH12:MI:SS AM');
内容的提问来源于stack exchange,提问作者r2deeptube
相关产品推荐
相关产品推荐

