SQL过程无法通过关键字BETWEEN正确执行

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

enter link description here我在这里尝试根据员工ID打孔生成与每日出勤相关的报告。我链接了3个表,第一个是“ EdailyEvents(存储所有Punch记录),第二个是“ EAllocations”(存储所有员工详细信息,包括他们的项目编号和组号,称为“ FCode”),第三个表是EPosted(存储所有工作的)在关注点审核后数小时)。

过程是。员工标记出勤后。记录将交给他的上级,由他的组号(FCODE)进行审查。一旦上级审核并发布了工时,这些内容将转到“ EPosted表”。

所以我想做的是。根据每个项目的编号和未完成审核的日期,从EAllocations表生成FCode列表。以下是我使用的查询。我需要根据他的分配日期“ EReportDate”生成报告,这意味着如果报告日期>审阅日期,则报告不应显示为待处理。我的问题是,当我使用此行代码“ EAllocations.ERportDate <= @ ToDate”时当员工报告日期大于审阅日期时,向我显示待审。例如:员工已在2019年11月28日报告并分配(在EAllocations中以黄色突出显示),但在报告中显示他的评论从21-11-2019到30-11-2019(显示为“ P”,如报告中标记)尚待审核我正在选择日期范围以生成报告。 @fromDate是21-11-2019&@ToDate是30-11-2019。

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
tsql sql-server-2008-r2 between
1个回答
0
投票

我认为您已经解决了复杂的问题。我相信这是您要查找的代码:

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 
    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
© www.soinside.com 2019 - 2024. All rights reserved.