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. 长期解决方案:修正表结构(推荐)
把日期存在字符串类型列里本身就是不合理的设计,很容易引发格式错误、性能问题。建议你彻底修正表结构:
- 先确保所有有效数据都转换成标准日期格式(比如
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
- 修改列的数据类型为
date:
ALTER TABLE [T_Receving] ALTER COLUMN [Date_of_receipt] date
之后你就可以直接用日期类型进行查询,再也不用每次手动转换,也能从根源避免格式错误问题。
内容的提问来源于stack exchange,提问作者user3262364
相关产品推荐
相关产品推荐

