将日期添加到字符串但得到:数据类型 varchar(max) 和日期在添加运算符中不兼容

Add date to string but getting: The data types varchar(max) and date are incompatible in the add operator

我在 table.I 中有一个列 date_of_creation 保存为 varchar 我正在尝试通过将 date_of_creation 字段转换为日期来获取日期之间的记录。

   SET @WhereQuery = @WhereQuery + ' AND CONVERT(Date,tbl.date_of_creation,103) BETWEEN ''' +CONVERT(date,ISNULL(@DateFrom,'1/1/1753'),101) + ''' + AND ''' +CONVERT(date,ISNULL(@DateTo, GETDATE()),101)+ ''''   
    
   PRINT @WhereClause

我低于错误

The data types varchar(max) and date are incompatible in the add operator.

我知道我收到此错误是因为我正在尝试将 DATE 类型与字符串连接 @WhereClause

如何解决这个问题?

你的引号放错了地方 @WhereClause != @WhereQuery.

DECLARE @WhereQuery NVARCHAR(MAX) = '', @DateFrom VARCHAR(12), @DateTo VARCHAR(21);

SET @WhereQuery = @WhereQuery
    + ' AND CONVERT(Date,tbl.date_of_creation,103)'
    + ' BETWEEN CONVERT(date,''' + ISNULL(@DateFrom,'1/1/1753') + ''',101)
    AND CONVERT(date,''' + ISNULL(@DateTo, CONVERT(VARCHAR(32),GETDATE(),101)) + ''',101)';

PRINT @WhereQuery;

请注意,您对 table 列使用英国格式 (103),对变量使用美国格式 (101),这似乎很奇怪。我本来希望他们是一致的。您确实需要确保对所使用的数据使用正确的格式。

对于我的测试,我使用了:

SET @WhereQuery = @WhereQuery
    + ' AND CONVERT(Date,tbl.date_of_creation,103)'
    + ' BETWEEN CONVERT(date,''' + ISNULL(@DateFrom,'1/1/1753') + ''',103)
    AND CONVERT(date,''' + ISNULL(@DateTo, CONVERT(VARCHAR(32),GETDATE(),103)) + ''',103)';

此外,我强烈建议将 date_of_creation 转换为正确的 datetime 日期类型。使用字符串存储日期时间值是自找麻烦。