添加日期时间作为参数会导致在存储过程中将数据类型 varchar 转换为日期时间时出错(错误)

Adding datetime as a parameter is giving Error converting data type varchar to datetime (Error) in stored procedure

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

但是当我用参数执行它时它给我错误,因为

Error converting data type varchar to 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

EXEC GET_EMP_REPORT '20160516'

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

如果您对 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
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()

其他答案有效,但我认为更简单声明:

SET DATEFORMAT dmy;
EXEC GET_EMP_REPORT '16/05/2016'