2016-05-19 3 views
0

У меня есть stored procedure, который принимает один параметр как @ReportDate.Добавление datetime в качестве параметра дает ошибку преобразования типа данных varchar в datetime (ошибка) в хранимой процедуре

но когда я исполню ее с параметром он дает мне ошибку как преобразование

Ошибка типа данных VARCHAR в DateTime.

Вот СП.

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' 

даты Pass в универсальном формате 'ГГГГММДД'

+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. Пожалуйста, обратитесь к приведенному ниже коду.

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

SELECT * FROM MyTable WHERE MyColumn BETWEEN CONVERT(DATETIME, @ReportDate, 103) AND GETDATE() 
Смежные вопросы