【发布时间】:2020-04-09 00:10:39
【问题描述】:
Sample Data我在这里尝试根据员工ID打卡生成与日常考勤相关的报告。我链接了 3 个表,第一个是“EdailyEvents(存储所有 Punch 记录),第二个是“EAllocations”(存储所有员工详细信息,包括他们的项目编号和组编号。称为“FCode”)第三个表是 EPosted(存储所有工作数小时后由关注点审核)。
过程是。一旦员工标记了他的出勤率。记录将提交给他的上级,根据他的组号 (FCODE) 进行审查。上级审核并发布工时后,这些工时将转到 EPosted Table。
所以我想做的是。从 EAllocations 表中生成 FCode 列表,针对每个项目编号和未完成审核的打卡日期。下面是我使用的查询。我需要根据他的分配日期“EReportDate”生成报告,这意味着如果报告日期>审核日期,则报告不应显示为待处理。我的问题是当我使用这行代码“EAllocations.ERportDate
我第一次尝试使用下面
CREATE PROCEDURE [dbo].[Pro_Pending]
-- ==================================================
-- DECLARE VARIABLES
-- ==================================================
@FromDate as date,
@ToDate as date,
@Pending as Varchar(1)='P'
AS
BEGIN
DECLARE
@LFromDate as date,
@LToDate as date
SET @LFromDate=@FromDate
SET @LToDate=@ToDate
SET NOCOUNT ON;
SELECT
EAllocations.EFCode AS 'FCODE NO.',
EDailyEvents.EPunchDate AS 'DATE',
EAllocations.EProjectNo 'PROJECT NO.',
EAllocations.EAdminName 'SITE ADMIN',
@PENDING AS 'STATUS'
FROM EAllocations
INNER JOIN
EDailyEvents ON EDailyEvents.EToken=EAllocations.EToken
WHERE
EAllocations.EReleaseDate IS NULL
AND
EAllocations.ERportDate<=@ToDate AND NOT EXISTS(SELECT EPosted.ETokenNo FROM EPosted
WHERE
EDailyEvents.EToken=EPosted.ETokenNo AND EDailyEvents.EPunchDate=EPosted.EPunchDate) AND EDailyEvents.EPunchDate BETWEEN @LFromDate AND @LToDate
OR
EAllocations.EReleaseDate >=EDailyEvents.EPunchDate
AND
EAllocations.ERportDate<=@ToDate AND NOT EXISTS(SELECT EPosted.ETokenNo FROM EPosted
WHERE
EDailyEvents.EToken=EPosted.ETokenNo AND EDailyEvents.EPunchDate=EPosted.EPunchDate) AND EDailyEvents.EPunchDate BETWEEN @LFromDate AND @LToDate
ORDER BY EAllocations.EFCode
END
我在下面尝试了第二次,但结果是一样的。
CREATE PROCEDURE [dbo].[Pro_Pending]
-- ==================================================
-- DECLARE VARIABLES
-- ==================================================
@FromDate as date,
@ToDate as date,
@Pending as Varchar(1)='P'
AS
BEGIN
DECLARE
@LFromDate as date,
@LToDate as date
SET @LFromDate=@FromDate
SET @LToDate=@ToDate
SET NOCOUNT ON;
SELECT DISTINCT
T.[FCODE NO.],
T.[DATE],
T.[PROJECT NO.],
T.[SITE ADMIN],
T.[STATUS]
FROM
(SELECT A.EFCode AS 'FCODE NO.',B.EPunchDate AS 'DATE',A.EProjectNo 'PROJECT NO.',A.EAdminName 'SITE ADMIN',A.ERportDate, @Pending AS 'STATUS'
FROM EAllocations AS A
INNER JOIN EDailyEvents AS B ON A.EToken=B.EToken
WHERE (
A.EReleaseDate IS NULL OR A.EReleaseDate >=B.EPunchDate
)
AND
NOT EXISTS(
SELECT P.ETokenNo FROM EPosted AS P
WHERE B.EToken=P.ETokenNo
AND B.EPunchDate=P.EPunchDate
)
) AS T
WHERE T.[DATE] BETWEEN @LFromDate AND @LToDate AND T.ERportDate<=@ToDate
END
第三次尝试以成功结束感谢所有尝试解决此问题的人。回答如下。
ALTER PROCEDURE [dbo].[Pro_Pending]
-- ==================
-- DECLARE VARIABLES
-- ==================
@FromDate as date,
@ToDate as date,
@Pending as Varchar(1)='P'
AS
BEGIN
DECLARE
@LFromDate as date,
@LToDate as date
SET @LFromDate=@FromDate
SET @LToDate=@ToDate
SET NOCOUNT ON;
SELECT DISTINCT
T.[FCODE NO.],
T.[DATE],
T.[PROJECT NO.],
T.[SITE ADMIN],
T.[STATUS]
FROM
(SELECT A.EFCode AS 'FCODE NO.',
B.EToken,
B.EPunchDate AS 'DATE',A.EProjectNo 'PROJECT NO.',A.EAdminName 'SITE ADMIN',A.ERportDate, @Pending AS 'STATUS'
FROM EAllocations AS A
INNER JOIN EDailyEvents AS B ON A.EToken=B.EToken
WHERE(
A.EReleaseDate IS NULL
OR A.EReleaseDate >=B.EPunchDate
)
AND a.ERportDate<=B.EPunchDate
) AS T
WHERE T.[DATE] BETWEEN @LFromDate AND @LToDate
AND (NOT EXISTS(
SELECT P.ETokenNo FROM EPosted AS P
WHERE P.ETokenNo = T.EToken
AND P.EPunchDate = T.[DATE]
))
【问题讨论】:
-
您使用的是哪个 dbms? (该代码是特定于产品的。也许是
。) -
@jarlh SQL 2008 R
-
包含 DDL 有助于我们了解列的数据类型。将
date与datetime进行比较是问题的常见来源。使用@StartDate <= MyDateTime and MyDateTime < DateAdd( day, 1, @EndDate )可确保包括结束日期的所有时间。 -
@HABO 比较列带有 "@FromDate" 、 "@ToDate" 和 PunchDate 都是 "Date" 数据类型。其他是 varchar 数据类型(FCODE、TOKEN、SITEADMIN、项目编号和状态)
标签: tsql sql-server-2008-r2 between