使用datetime类型手动赋值遇范围错误,如何正常执行该SQL语句?
解决datetime类型手动赋值报错的问题
问题现象
- 执行以下代码时无报错,可正常获取当前时间:
declare @dd datetime = GETDATE() select @dd - 手动给datetime类型变量赋值字符串时触发错误:
错误提示:declare @dd datetime = '2023-08-25 13:03:28.573' select @ddThe conversion of a varchar data type to a datetime data type resulted in an out-of-range value
(中文翻译:varchar数据类型转换为datetime数据类型时产生了超出范围的值) - 改用datetime2类型则可正常赋值:
declare @dd datetime2 = '2023-08-25 13:03:28.573' select @dd
问题原因
SQL Server中datetime类型的字符串转换依赖会话的语言/区域设置。如果当前会话语言(比如美式英语)将yyyy-mm-dd格式解析为yyyy-dd-mm,2023-08-25会被识别为“2023年25月8日”,月份超出1-12的范围,从而触发报错。另外datetime的毫秒精度为3.33毫秒(最终存储为000、333、667这类近似值),但此处的573会被自动近似为570,不是报错的直接原因。
解决方案
要实现用datetime类型手动赋值并得到期望结果2023-08-25 13:03:28.573,可使用以下几种方法:
方法1:显式指定转换格式
使用CONVERT函数指定格式代码(121对应ODBC规范的yyyy-mm-dd hh:mi:ss.mmm格式,不受语言设置影响):
declare @dd datetime = CONVERT(datetime, '2023-08-25 13:03:28.573', 121) select @dd
方法2:使用不受语言影响的日期字符串格式
采用YYYYMMDD HH:MI:SS.MMM格式的字符串,SQL Server会统一按此规则解析:
declare @dd datetime = '20230825 13:03:28.573' select @dd
方法3:匹配当前会话的语言格式
如果当前会话语言为中文,可使用yyyy/mm/dd格式的字符串:
declare @dd datetime = '2023/08/25 13:03:28.573' select @dd
内容的提问来源于stack exchange,提问作者Cagri Cakoglu
相关产品推荐
相关产品推荐

