首页 > 解决方案 > 从字符串转换日期时间时出现转换错误

问题描述

我正在尝试创建一个存储过程。日期列使用varchar数据类型。

我希望能够使用日期作为约束来选择数据。

ALTER PROCEDURE [dbo].[spStatusReport]
     @ShipFrom VARCHAR(20) = NULL,
     @ShipTo VARCHAR(20) = NULL,
AS
    SELECT 
        LOCATION, NEXT_DEPT,
        CAST(CONVERT(VARCHAR, REQ_DATE, 104) AS DATETIME) AS REQ_DATE,
        CAST(CONVERT(VARCHAR, SCH, 104) AS DATETIME) AS SCH,
        Tool
    FROM 
        Status_Report 
    WHERE 
        (@ShipFrom IS NULL OR 
         CAST(CONVERT(VARCHAR, SCH, 104) AS DATETIME) >= CAST(CONVERT(VARCHAR, @ShipFrom, 104) AS DATETIME))
        AND (@ShipTo IS NULL OR 
             CAST(CONVERT(VARCHAR, SCH, 104) AS DATETIME) <= CAST(CONVERT(VARCHAR, @ShipTo, 104) AS DATETIME))

当我尝试执行这个存储过程

exec spStatusReport '12/04/2018','NULL'

我希望用户只能传递一个参数 ShipFrom 或 ShipTO 甚至两者都传递,但我收到此错误

从字符串转换日期和/或时间时转换失败

标签: sqlsql-server

解决方案


您传递的是文字字符串 'NULL'而不是值NULL;他们不一样。此外,您应该使用 ISO 格式的日期,这样它就不会模棱两可了。尝试以下方法之一:

EXEC spStatusReport '20180412',NULL;

EXEC spStatusReport @ShipFrom = '20180412';

编辑:Sean Lange 在评论中也是正确的。您的参数应该是 a date,而不是 a varchar始终使用适合您的数据的数据类型。varchar远非“一刀切”的数据类型。


推荐阅读