将datetime添加为参数会在存储过程中将数据类型varchar转换为datetime(Error)时出错

问题描述 投票:1回答:4

我有一个stored procedure接受一个参数作为@ReportDate

但是当我用参数执行它时,它会给出错误

将数据类型varchar转换为datetime时出错。

这是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

sql datetime stored-procedures sql-server-2005
4个回答
1
投票
EXEC GET_EMP_REPORT '20160516'

以通用格式'yyyyMMdd'传递日期


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
投票
DECLARE @ReportDate DATETIME
SET @ReportDate ='31/12/2016' -- DD/MM/YYYY Format you cant insert . It will give the below error

将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

如果你真的需要以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()

0
投票

其他答案有效,但在我看来更简单的声明:

SET DATEFORMAT dmy;
EXEC GET_EMP_REPORT '16/05/2016'
© www.soinside.com 2019 - 2024. All rights reserved.