2014-10-01 28 views
0

我已經存儲了proc,它檢查日期是否不在工作日,並在需要時進行更改。我在下面的視覺工作室中調用這個過程。但是,當proc運行時,我收到The conversion of a varchar data type to a datetime data type resulted in an out-of-range value消息。當我在SQL Server Management Studio中使用與Visual Studio中使用的值相同的值運行相同的過程時,它可以工作。將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值 - 存儲過程

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年9月30日

+1

我想你'input.date'包含日期值以這種形式 - **「30/09/2014(日/月/年)「**。但最好在sql標準格式中傳遞日期爲 - **「yyyy-mm-dd」**。這可能會解決您的問題。 – 2014-10-01 11:04:33

+0

@KrishnrajRana,** yyyy-mm-dd不是sql標準!**'2014-10-01'在歐洲成爲1月10日。使用** yyyymmdd ** – adrianm 2014-10-01 11:14:28

回答

1

改變你的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)} 
       }; 
+0

感謝您的迴應。當我按照你的建議,我得到了'錯誤轉換數據類型nvarchar datetime.'和輸入參數現在是'30/09/2014 00:00:00' – user667430 2014-10-01 11:40:35

+0

道歉修復了上述問題,現在似乎都是wrking。這是input.date的數據類型需要更改爲DateTime – user667430 2014-10-01 11:50:44

+0

沒有問題。我很高興它有幫助 – Damith 2014-10-01 12:02:52

相關問題