将varchar数据类型转换为datetime数据类型导致值超出范围-存储过程

本文关键字:范围 存储过程 数据 varchar 类型转换 数据类型 datetime | 更新日期: 2023-09-27 18:25:08

我有一个存储过程,它检查日期是否不在工作日,并在必要时更改它。我在visualstudio中调用这个proc,如下所示。然而,当进程运行时,我会收到The conversion of a varchar data type to a datetime data type resulted in an out-of-range value消息。当我在SQLServerManagementStudio中使用visualstudio中使用的相同值运行相同的proc时,它就可以工作了。

ALTER PROCEDURE [dbo].[usp_PSTN_GetWorkingDay]
    @TargetDate VARCHAR(30)
AS  
BEGIN
    SET NOCOUNT ON;
    /* Workout 10 working days from present date */
    DECLARE @MaxDateCantBook DATETIME
    ;WITH DatesCTE AS
    (
        SELECT Date_Id,
               Date_Date,
               Date_JDE,
               Is_WorkingDay,
               ROW_NUMBER() OVER(ORDER BY Date_Date) AS rn
        FROM   dbo.Dates
        WHERE  Is_WorkingDay = 1
               AND Date_Date > GETDATE()
    )
    SELECT @MaxDateCantBook = (SELECT Date_Date FROM DatesCTE WHERE rn = 10)                                      
    /* Change Target date if it is less than 10 working days in the future */
    IF(@TargetDate <= @MaxDateCantBook)
    BEGIN
        SET @TargetDate = @MaxDateCantBook
    END

    SELECT Date_Date
    FROM dbo.Dates
    WHERE Date_Date >= @TargetDate
    AND Date_Date <= (SELECT MIN(Date_Date) 
                        FROM dbo.Dates 
                        WHERE Is_WorkingDay != 0 AND Date_Date >= @TargetDate)
    ORDER BY Date_Date DESC

END 

我正在为查询设置如下参数:

List<SqlParameter> parameters = new List<SqlParameter>()
              {
                  new SqlParameter("TargetDate", SqlDbType.VarChar, 30){ Value = input.date}
              };

其中input.date是字符串=2014-09-30

将varchar数据类型转换为datetime数据类型导致值超出范围-存储过程

将SP中的@TargetDate VARCHAR(30)更改为@TargetDate DATETIME

当你设置参数时,你可以按照

cmd.Parameters.AddWithValue("@TargetDate",
         DateTime.ParseExact(input.date, "yyyy-MM-dd", CultureInfo.InvariantCulture));

List<SqlParameter> parameters = new List<SqlParameter>()
              {
                  new SqlParameter("@TargetDate", SqlDbType.DateTime){ Value = DateTime.ParseExact(input.date, "yyyy-MM-dd", CultureInfo.InvariantCulture)}
              };