【问题标题】:Add date to string but getting: The data types varchar(max) and date are incompatible in the add operator将日期添加到字符串但得到:数据类型 varchar(max) 和 date 在 add 运算符中不兼容
【发布时间】:2020-09-15 22:25:52
【问题描述】:

我在表中有一个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

我遇到了错误

数据类型 varchar(max) 和 date 在 add 运算符中不兼容。

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

如何解决这个问题?

【问题讨论】:

    标签: sql-server tsql dynamic-sql


    【解决方案1】:

    你的引号放错了地方,@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;
    

    请注意,您对表格列使用英式格式 (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 日期类型。使用字符串存储日期时间值是自找麻烦。

    【讨论】:

    • 现在从字符串转换日期和/或时间时转换失败。
    • 您是否阅读了我对答案的倒数第二条评论?您正在混淆您的日期格式,我不知道您真正使用什么来纠正它。如果您将所有格式更改为 103,它可能会起作用。
    • 我使用了你提到的相同的sql,没有任何改变
    • 嗯,是的,但是我使用了与您相同的 SQL……因为我无法访问您的表和变量值,所以我只能按照提供的方式对其进行测试。如果您的日期采用您期望的格式,则它有效,但否则无效。试试 103。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多