【问题标题】:SQL Procedure is not executing correctly With BETWEEN KeywordSQL 过程没有正确执行 BETWEEN 关键字
【发布时间】: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 有助于我们了解列的数据类型。将datedatetime 进行比较是问题的常见来源。使用@StartDate &lt;= MyDateTime and MyDateTime &lt; DateAdd( day, 1, @EndDate ) 可确保包括结束日期的所有时间。
  • @HABO 比较列带有 "@FromDate" 、 "@ToDate" 和 PunchDate 都是 "Date" 数据类型。其他是 varchar 数据类型(FCODE、TOKEN、SITEADMIN、项目编号和状态)

标签: tsql sql-server-2008-r2 between


【解决方案1】:

我认为你已经把事情复杂化了。 我相信这是您正在寻找的代码:

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

【讨论】:

  • 亲爱的@Zohar Peled,我从查询中得到的结果仍然相同。非常感谢您的回复。
  • 好吧,如果您使用示例数据(如 DDL+DML)和所需结果编辑您的帖子,我们可以在发布之前测试我们的答案...
  • 我放置了一张带有样本数据的图片。由于行数更多,来自 Eposted 的数据很难完整填写。谢谢。
  • 图片没有帮助。示例数据仅在可以复制并粘贴到测试环境中时才有用。
  • @Zohar Peled 添加了 Excel 格式的示例 data.in 的下载链接。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多