首页 > 解决方案 > 返回日期 超过目标日期 7 天 | SQL

问题描述

我试图让所有仍然开放的票在指定的“关闭”日期前 7 天,而“开票日期”在 7 天后。门票长这样:

Work Order: Description:     Status:     Task:     End Date:     Billed On:
---------------------------------------------------------------------------
INC1234     Broken Monitor   OPEN        1         03/25/2021    03/25/2021
INC1235     No Audio         OPEN        1         04/03/2021    04/01/2021
    

INC1234理论上,只有当这张票符合条件时,查询才会返回。工单号、描述、开单日期和状态存储在一个表中,任务存储在另一个表中,结束日期存储在第三个表中。

我有的:

SELECT DISTINCT
    wo.proposal AS 'Work Order',
    wo.description AS 'Description',
    wo.status_code AS 'Status',
    phs.task AS 'Task',
    wo.act_end_dt AS 'End Date',
    fnd.tranx_date AS 'Billed On'
FROM
    table1 wo
LEFT OUTER JOIN
    table2 phs ON (wo.proposal = phs.proposal)
LEFT OUTER JOIN
    table3 fnd ON (wo.proposal = fnd.proposal)
WHERE
    wo.status_code = 'OPEN'
    AND phs.act_end_dt <= DATEADD(day, -7, GETDATE())
    AND fnd.tranx_date <= DATEADD(day, -7, GETDATE())

有时,一张票会收取多张账单。此查询似乎只获取第一个计费交易而不是最新交易。(因此,如果它在 3 月 23 日和 3 月 31 日有账单,它只会抓住 3 月 23 日,这是不正确的)我似乎无法让它抓住最新的账单日期并从那时起 7 天。

标签: sqlsql-serverdate-arithmetic

解决方案


工单、描述、状态代码和结束日期来自同一张表。任务来自另一个表。Billed On 来自另一张桌子。

你想获取一个票号对应表的最新交易。一种解决方案可以是定义一个视图,该视图将包含该表的子集,其中每个工单仅出现一次,并且具有最大日期。然后您可以在查询中使用该视图;只需用该视图替换 table3 即可。

视图可以写成一个聚合:

select proposal, max(tranx_date) from table3 group by proposal;

假设该视图名为 table3_view,那么您的查询可以像您一样通过将 table3 替换为 table3_view 来编写:

SELECT DISTINCT
wo.proposal AS 'Work Order',
wo.description AS 'Description',
wo.status_code AS 'Status',
phs.task AS 'Task',
wo.act_end_dt AS 'End Date',
fnd.tranx_date AS 'Billed On'
FROM
table1 wo
LEFT OUTER JOIN
table2 phs ON (wo.proposal = phs.proposal)
LEFT OUTER JOIN
table3_view fnd ON (wo.proposal = fnd.proposal)
WHERE
wo.status_code = 'OPEN'
AND
phs.act_end_dt <= DATEADD(day, -7, GETDATE())
AND
fnd.tranx_date <= DATEADD(day, -7, GETDATE())

推荐阅读