如何在 SQL Server 中从今天的日期获取 > 240 天的数据,其中某些记录的特定单元键在 240 天之内和之外

Posted

技术标签:

【中文标题】如何在 SQL Server 中从今天的日期获取 > 240 天的数据,其中某些记录的特定单元键在 240 天之内和之外【英文标题】:How to get > 240 days data from today's date in SQL Server, where particular unit key of some records are within and outside 240 days 【发布时间】:2021-06-17 10:27:35 【问题描述】:

如何在 SQL Server 中从今天的日期获取 > 240 天(或 8 个月)的数据,其中某些记录的特定 unit_key 在 240 天之内和之外。因此消除这些记录。此表中可用的数据从 2019 年开始并搜索记录从 01.01.2020 (allocation_date) 开始

FL_DATA 表

fl_key fl_no allocation_date unit_key unit_name
1 FL/3352 02/20/2021 54 A Pradhan
5 FL/3374 07/14/2020 54 A Pradhan
8 FL/3469 08/16/2019 54 A Pradhan
11 FL/3578 06/22/2019 54 A Pradhan
15 FL/3670 06/15/2020 60 D Raj
22 FL/3692 04/22/2020 60 D Raj
9 FL/3542 07/20/2020 64 K Parihar
33 FL/3599 05/27/2020 64 K Parihar
46 FL/3645 11/13/2019 64 K Parihar
48 FL/3640 02/22/2021 22 R Raja
52 FL/3724 12/28/2020 22 R Raja
12 FL/3342 03/20/2020 22 R Raja
13 FL/3355 12/20/2019 22 R Raja

输出表:

fl_no unit_key unit_name
FL/3670 60 D Raj
FL/3692 60 D Raj
FL/3542 64 K Parihar
FL/3599 64 K Parihar

我的可能查询是

选择 fl_no,unit_key,unit_name 来自 FL_DATA 其中 DATEDIFF(day, allocation_date, getdate()) > 240 和 allocation_date>='01/01/2020' 按 unit_key 排序

但在 where 子句中,如果我写 >240 或

在我的表格中,数据从 2018 年开始可用,而我对数据的要求是从 2020 年至今,这就是我提到“allocation_date>='01/01/2020'”的原因

我希望我明白了我的意思并期待确切的查询格式。

【问题讨论】:

你考虑过DATEADD吗?您尝试过什么,为什么没有成功? 您需要提供更多详细信息。解释采用十几行表并将其压缩为 4 行结果集的逻辑。短语“搜索记录从 01.01.2020 开始”似乎是要包含在某些 WHERE 子句中的过滤器。努力吧! 【参考方案1】:

你去吧:

SELECT  T.fl_no,
        T.unit_key,
        T.unit_name,
        DATEDIFF(DAY, T.allocation_date, GETDATE()) AS days_past
FROM    FL_DATA     AS T

WHERE   T.allocation_date >= '2020-01-01'
AND     NOT EXISTS
        (
            SELECT  1
            FROM    FL_DATA     AS  Recent
            
            WHERE   Recent.allocation_date >= DATEADD(DAY, -240, GETDATE())
            AND     Recent.unit_key = T.unit_key
        )

如果解决了,或者是否需要一些调整,请告诉我

【讨论】:

这个查询绝对可以正常工作。你能显示总数吗?单独列中的天数 我为此请求添加了一个新答案,如果它符合您的期望,请告诉我【参考方案2】:

如果您想在单独的列中包含天数,我建议改用 OUTER APPLY:

SELECT  T.fl_no,
        T.unit_key,
        T.unit_name,
        unit_key_agg.days_past
FROM    FL_DATA                 AS T

OUTER APPLY
(
    SELECT  DATEDIFF(
                DAY,
                MAX(Recent.allocation_date),
                GETDATE()
            )                   AS  days_past
    FROM    FL_DATA             AS  Recent
        
    WHERE   Recent.unit_key     =   T.unit_key
)   AS      unit_key_agg

WHERE   T.allocation_date       >=  '2020-01-01'
AND     unit_key_agg.days_past  >   240

这个查询会给你这个结果:

fl_no unit_key unit_name days_past
FL/3670 60 D Raj 375
FL/3692 60 D Raj 375
FL/3542 64 K Parihar 340
FL/3599 64 K Parihar 340

【讨论】:

此查询运行良好。但我需要每一行 days_past 值,而不是特定 unit_key 的 MAX 值。 我明白了,所以我想第一个答案是一个更好的选择。我编辑了第一个答案 - 添加了 past_days 列。如果可以,请将答案标记为正确答案,谢谢:) 第一个答案符合我的期望并且工作正常。

以上是关于如何在 SQL Server 中从今天的日期获取 > 240 天的数据,其中某些记录的特定单元键在 240 天之内和之外的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中从月份和年份创建日期

在 Laravel 5.3 中从 SQL Server 获取多个结果集

如何在sql中从给定的月份和年份获取月份的第一天和最后一天

在 where 子句中从当前日期减去 30 天

如何在Angular Material Datepicker中从今天的日期中移除焦点?

如何通过在 SQL Server 中选择周数来获取开始日期和结束日期