无法执行存储过程
Not able to execute the stored procedure
我有 table,其中我的日期列值也随时间一起保存
像这样2016-06-10 14:56:11.000
现在,在执行我的 SP 时,我像这样 exec UserReportData '06-10-2016'
传递了一个参数作为日期,但它没有显示任何记录。因为它在 table.
中有 4 条记录
为什么?
更新
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
DECLARE @REPORTDATE datetime
DECLARE @OPENING INT
SELECT *
INTO #temptable
FROM
(SELECT DISTINCT
a.CUser_id, b.User_Id,a.U_datetime as REPORTDATE,
b.first_name + ' ' + b.last_name AS USERNAME,
0 OPENING, 0 TOTAL_DOCUMENT, 0 INWARD, 0 FIRST_LEVEL_PROCESSING, 0 DATA_ENTRY
FROM
inward_doc_tracking_trl a, user_mst b
WHERE
a.CUser_id = b.mkey
AND a.U_datetime = CONVERT(varchar(10), @As_ONDATE, 103)) AS x
DECLARE Cur_1 CURSOR FOR
SELECT CUser_id, User_Id
FROM #temptable
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
SELECT @REPORTDATE
FROM inward_doc_tracking_trl
WHERE U_datetime = CONVERT(varchar(10), @As_ONDATE, 103)
UPDATE #temptable
SET REPORTDATE = @REPORTDATE
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 #temptable
DROP TABLE #temptable
END
您将日期作为字符串传递(隐式时间为 00:00),您将其转换为日期,但时间仍为 00:00,并尝试将日期与次。由于时间不匹配,不会有任何结果。
您必须:
- 将日期时间转换为日期以匹配准确的日期(不好,需要重新计算列中的每个日期)
- 将搜索更改为在日期 + '00:00' 到日期 + '23:59' 之间查找(或者如果您愿意,可以添加一天)
更新您的 where 子句以采用简单的选项 2:
where a.CUser_id = b.mkey
and a.U_datetime BETWEEN CONVERT(varchar(10), @As_ONDATE, 103)
AND DATEADD(day, 1, CONVERT(varchar(10), @As_ONDATE, 103))
我有 table,其中我的日期列值也随时间一起保存
像这样2016-06-10 14:56:11.000
现在,在执行我的 SP 时,我像这样 exec UserReportData '06-10-2016'
传递了一个参数作为日期,但它没有显示任何记录。因为它在 table.
为什么?
更新
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
DECLARE @REPORTDATE datetime
DECLARE @OPENING INT
SELECT *
INTO #temptable
FROM
(SELECT DISTINCT
a.CUser_id, b.User_Id,a.U_datetime as REPORTDATE,
b.first_name + ' ' + b.last_name AS USERNAME,
0 OPENING, 0 TOTAL_DOCUMENT, 0 INWARD, 0 FIRST_LEVEL_PROCESSING, 0 DATA_ENTRY
FROM
inward_doc_tracking_trl a, user_mst b
WHERE
a.CUser_id = b.mkey
AND a.U_datetime = CONVERT(varchar(10), @As_ONDATE, 103)) AS x
DECLARE Cur_1 CURSOR FOR
SELECT CUser_id, User_Id
FROM #temptable
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
SELECT @REPORTDATE
FROM inward_doc_tracking_trl
WHERE U_datetime = CONVERT(varchar(10), @As_ONDATE, 103)
UPDATE #temptable
SET REPORTDATE = @REPORTDATE
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 #temptable
DROP TABLE #temptable
END
您将日期作为字符串传递(隐式时间为 00:00),您将其转换为日期,但时间仍为 00:00,并尝试将日期与次。由于时间不匹配,不会有任何结果。
您必须:
- 将日期时间转换为日期以匹配准确的日期(不好,需要重新计算列中的每个日期)
- 将搜索更改为在日期 + '00:00' 到日期 + '23:59' 之间查找(或者如果您愿意,可以添加一天)
更新您的 where 子句以采用简单的选项 2:
where a.CUser_id = b.mkey
and a.U_datetime BETWEEN CONVERT(varchar(10), @As_ONDATE, 103)
AND DATEADD(day, 1, CONVERT(varchar(10), @As_ONDATE, 103))