SQL Server中如何将格式为'dd/mm/yyyy hh:mm:ss'的varchar类型转换为datetime类型?
解决Varchar转Datetime时的“超出范围”错误
这问题我之前踩过坑!核心原因是SQL Server默认的日期转换规则是美式的mm/dd/yyyy,而你的数据是欧式的dd/mm/yyyy格式——比如如果有一条数据是31/01/2024 10:30:00,SQL会把第一个31当成月份,自然就触发“超出范围”的错误了。
给你几个靠谱的解决方案:
1. 用CONVERT指定欧式日期样式
SQL Server内置了样式码,103对应的就是dd/mm/yyyy格式(英式/欧式),直接用它转换就能匹配你的数据:
SELECT CONVERT(DATETIME, TSTAMP, 103) AS DATE
时间部分会被自动识别,不用额外处理。
2. 用TRY_CONVERT处理脏数据(SQL Server 2012+)
如果你的数据里有格式错误的行(比如32/13/2024这种无效日期),普通的CONVERT会直接报错中断查询。这时候用TRY_CONVERT更安全,转换失败的行会返回NULL,不会影响整个查询:
SELECT TRY_CONVERT(DATETIME, TSTAMP, 103) AS DATE
你还可以用它找出所有格式错误的行:
SELECT TSTAMP FROM YourTableName WHERE TRY_CONVERT(DATETIME, TSTAMP, 103) IS NULL
3. 用PARSE指定文化(SQL Server 2012+)
另一种更直观的方式是用PARSE函数,直接指定文化为英式(en-GB),它会自动识别dd/mm/yyyy格式:
SELECT PARSE(TSTAMP AS DATETIME USING 'en-GB') AS DATE
不过PARSE的性能比CONVERT稍差一点,数据量特别大的时候优先选CONVERT。
试试上面的方法,应该就能解决你的转换问题啦!
内容的提问来源于stack exchange,提问作者Wolowizard
相关产品推荐
相关产品推荐

