You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用datetime类型手动赋值遇范围错误,如何正常执行该SQL语句?

解决datetime类型手动赋值报错的问题

问题现象

  • 执行以下代码时无报错,可正常获取当前时间:
    declare @dd datetime = GETDATE()
    select @dd
    
  • 手动给datetime类型变量赋值字符串时触发错误:
    declare @dd datetime = '2023-08-25 13:03:28.573' 
    select @dd
    
    错误提示:

    The 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:00:55