添加日期时间作为参数会导致在存储过程中将数据类型 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'
我有一个 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'