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

SQL Server中使用样式103转换nvarchar日期失败求助

解决SQL Server中日期字符串转换失败的问题

这个错误的核心原因很明确:你的Date_of_receipt列是nvarchar(50)类型,里面存在不符合103格式(dd/mm/yyyy)的脏数据——可能是乱码、错误的日期格式(比如mm/dd/yyyy)、非日期字符串,甚至是空值或者无效日期(比如32/13/2020)。SQL Server在执行WHERE子句时会先尝试转换所有行的Date_of_receipt值,一旦遇到无法转换的内容,就会直接抛出转换失败的错误。

下面是分步解决的方案:

1. 先定位脏数据

首先用TRY_CONVERT函数找出所有无法转换成有效日期的行——这个函数转换失败时会返回NULL,不会触发错误:

SELECT [Client_code], [Date_of_receipt]
FROM [T_Receving]
WHERE TRY_CONVERT(date, [Date_of_receipt], 103) IS NULL

拿到这些脏数据后,你可以根据实际业务逻辑修正(比如改成正确的dd/mm/yyyy格式)或者删除无效行。

2. 临时筛选有效数据(无需先清理)

如果不想马上处理脏数据,想先拿到符合日期范围的有效记录,可以用TRY_CONVERT过滤掉转换失败的行:

SELECT TRY_CONVERT(date, [Date_of_receipt], 103) AS Date_of_Receipt
FROM [T_Receving]
WHERE TRY_CONVERT(date, [Date_of_receipt], 103) BETWEEN '2015-03-06' AND '2018-05-06'
  AND TRY_CONVERT(date, [Date_of_receipt], 103) IS NOT NULL

这样只会处理能成功转换的行,避免报错。

3. 长期解决方案:修正表结构(推荐)

把日期存在字符串类型列里本身就是不合理的设计,很容易引发格式错误、性能问题。建议你彻底修正表结构:

  1. 先确保所有有效数据都转换成标准日期格式(比如yyyy-mm-dd):
UPDATE [T_Receving]
SET [Date_of_receipt] = CONVERT(nvarchar(10), TRY_CONVERT(date, [Date_of_receipt], 103), 23)
WHERE TRY_CONVERT(date, [Date_of_receipt], 103) IS NOT NULL
  1. 修改列的数据类型为date:
ALTER TABLE [T_Receving]
ALTER COLUMN [Date_of_receipt] date

之后你就可以直接用日期类型进行查询,再也不用每次手动转换,也能从根源避免格式错误问题。

内容的提问来源于stack exchange,提问作者user3262364

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:36:21