将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
将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)}
};