2016-05-19 39 views
0

我有一個stored procedure,它接受一個參數爲@ReportDate將datetime作爲參數添加錯誤將數據類型varchar轉換爲存儲過程中的datetime(Error)

但是當我用參數執行它作爲

錯誤轉換數據類型爲varchar到日期時間給我的錯誤。

這是SP。

ALTER PROCEDURE [dbo].[GET_EMP_REPORT] 
@ReportDate Datetime 
AS 
BEGIN 
DECLARE @Count INT 
DECLARE @Count_closed INT 
DECLARE @Count_pending INT 
DECLARE @Count_wip INT 
DECLARE @Count_transferred INT 
DECLARE @Count_prevpending INT 
    SELECT * 
     INTO #temp 
    FROM ( 
    select distinct a.CUser_id,a.CUser_id User_Id, b.first_name + ' ' + b.last_name NAME, 
    0 RECEIVED, 0 CLOSED, 
    0 PENDING, 0 WIP, 0 TRANSFERRED, 0 PREV_PENDING 
    from inward_doc_tracking_trl a, user_mst b 
    where a.CUser_id = b.mkey 
    ) AS x 
    DECLARE Cur_1 CURSOR 
    FOR SELECT CUser_id, User_Id FROM #temp 
    OPEN Cur_1 
    DECLARE @CUser_id INT 
     DECLARE @User_Id INT 
    FETCH NEXT FROM Cur_1 
    INTO @CUser_id, @User_Id 
    WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    /***** received *******/ 
    SELECT @Count = COUNT(*) FROM inward_doc_tracking_trl 
    WHERE CUser_id = @CUser_id 
    AND NStatus_flag = 4 
    AND CStatus_flag = 1 
    AND U_datetime BETWEEN @ReportDate AND GETDATE() 
    /***** closed *******/ 
    SELECT @Count_closed = COUNT(*) FROM inward_doc_tracking_trl 
    WHERE CUser_id = @CUser_id 
    AND NStatus_flag = 5 
    AND U_datetime BETWEEN @ReportDate AND GETDATE() 
    /***** pending *******/ 
    SELECT @Count_pending = COUNT(*) FROM inward_doc_tracking_trl trl 
    INNER JOIN inward_doc_tracking_hdr hdr ON hdr.mkey = trl.ref_mkey 
    WHERE trl.N_UserMkey = @CUser_id 
    AND trl.NStatus_flag = 4 
    AND trl.CStatus_flag = 1 
    AND hdr.Status_flag = 4 
    AND trl.U_datetime BETWEEN @ReportDate AND GETDATE() 
    /***** wip *******/ 
    SELECT @Count_wip = COUNT(*) FROM inward_doc_tracking_trl trl 
    INNER JOIN inward_doc_tracking_hdr hdr ON hdr.mkey = trl.ref_mkey 
    INNER JOIN (select max(mkey) mkey,ref_mkey from inward_doc_tracking_trl   where NStatus_flag = 2 group by ref_mkey) trl2 
    ON trl2.mkey = trl.mkey and trl2.ref_mkey = trl.ref_mkey 
    WHERE trl.N_UserMkey = @CUser_id 
    AND trl.NStatus_flag = 2 
    AND hdr.Status_flag = 2 
    AND trl.U_datetime BETWEEN @ReportDate AND GETDATE() 
     /***** transferred *******/ 
     SELECT @Count_transferred = COUNT(*) FROM inward_doc_tracking_trl 
     WHERE CUser_id = @CUser_id 
    AND NStatus_flag = 4 
    AND CSTATUS_flag <> 1 
     AND U_datetime BETWEEN @ReportDate AND GETDATE() 
    /******** Previous pending **********/ 
    SELECT @Count_prevpending = COUNT(*) FROM inward_doc_tracking_trl trl 
    INNER JOIN inward_doc_tracking_hdr hdr ON hdr.mkey = trl.ref_mkey 
    INNER JOIN (select max(mkey) mkey,ref_mkey from inward_doc_tracking_trl  where NStatus_flag = 2 group by ref_mkey) trl2 
    ON trl2.mkey = trl.mkey and trl2.ref_mkey = trl.ref_mkey 
    WHERE trl.N_UserMkey = @CUser_id 
    AND trl.NStatus_flag = 2 
    AND hdr.Status_flag = 2 
    AND trl.U_datetime < @ReportDate 
    UPDATE #temp 
    SET RECEIVED = @Count, 
     CLOSED = @Count_closed, 
    PENDING = @Count_pending, 
    WIP = @Count_wip, 
     TRANSFERRED = @Count_transferred, 
    PREV_PENDING = @Count_prevpending 
    WHERE CUser_id = @CUser_id 
    AND User_Id = @User_Id 
     FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id 
    END 
    CLOSE Cur_1 
    DEALLOCATE Cur_1 
     SELECT * FROM #temp 
    END 

我喜歡執行進入這個EXEC GET_EMP_REPORT '16/05/2016'

當前的日期格式爲DD/MM/YYYY它給我的錯誤。 執行它作爲MM/DD/YYYY的作品,但我寧願執行它作爲DD/MM/YYYY

,但得到的錯誤

我正在使用的通用格式SQL-server-2005

回答

1
EXEC GET_EMP_REPORT '20160516' 

證日期「年月日」

+0

我想用'dd/MM/yyyy'格式 – BNN

+0

格式僅用於傳遞值。你可以將@ReportDate轉換成你想在程序 –

+0

裏面想要的任何格式你可以展示怎麼做? – BNN

0

如果您對Date and Time Styles自己的喜好,你最好使用功能CONVERT通過精確優選的風格,例如DD/MM/YYYY

DECLARE @ReportDate DATETIME = CONVERT(DATETIME, '16/05/2016', 103) 
EXEC GET_EMP_REPORT @ReportDate 

或者

DECLARE @ReportDate DATETIME = CONVERT(DATETIME, '16/05/16', 3) 
EXEC GET_EMP_REPORT @ReportDate 
+0

錯誤爲'關鍵字'CONVERT'附近的語法不正確。' – BNN

+0

必須有另一種方式,比其他聲明更好。也許在SP內嵌入轉換? –

0
DECLARE @ReportDate DATETIME 
SET @ReportDate ='31/12/2016' -- DD/MM/YYYY Format you cant insert . It will give the below error 

varchar數據類型爲datetime數據類型的轉換導致外的範圍內的值。

如果你確實需要插入相同的DD/MM/YYYY格式。將@ReportDate聲明爲Varchar.Please請參考下面的代碼。

DECLARE @ReportDate VARCHAR(10) 
SET @ReportDate ='31/12/2016' 

SELECT * FROM MyTable WHERE MyColumn BETWEEN CONVERT(DATETIME, @ReportDate, 103) AND GETDATE() 
相關問題