gpt4 book ai didi

sql - 如何使用 SQL 从数据库中选择最近 2 个季度的数据?

转载 作者:行者123 更新时间:2023-11-29 01:13:41 25 4
gpt4 key购买 nike

我的数据库中有过去 2 年的模型数据。我只想从过去 2 个季度的数据库表中选择那些模型。

假设,Sysdate-> 29/07/2013(七月)

我应该能够从以下季度的月份检索模型

Q1-April,May,June(last quarter)

Q2-July,Aug,Sep(Including quarter)

下面的查询需要如何更改?

Select model_id,model_name,Effective_date_from,effective_date_to 
from model
where active='YES';

最佳答案

更新

对于甲骨文:

FROM mytable t
JOIN ( SELECT ADD_MONTHS(TRUNC(SYSDATE,'Q'),3) AS b
, ADD_MONTHS(TRUNC(SYSDATE,'Q'),-3) AS e
FROM DUAL
) dr
ON NOT ( t.effective_date_from >= dr.e OR t.effective_date_to < dr.b )
OR ( t.effective_date_from IS NULL AND t.effective_date_to IS NULL )

对于 MySQL:

FROM mytable t
JOIN ( SELECT MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-2 QUARTER AS b
, MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-0 QUARTER AS e
) dr
ON NOT ( t.effective_date_from >= dr.e OR t.effective_date_to < dr.b )
OR ( t.effective_date_from IS NULL AND t.effective_date_to IS NULL )

在查看 slOppy 的答案并再次查看问题后,我意识到您有两个 日期列,effective_date_fromeffective_date_to ,而且我没有考虑到您可能想要检索 from 之间任何 时间点的行。和 to日期值在指定日期范围内的任何时间(在上一季度开始和下一季度开始之间)。

为了简化(现在),我将只考虑生效日期为 from < to 的情况。 .

可能的情况可以(相当粗略地)描述如下: 竖线代表 drbdre (日期范围开始和结束) 小于号代表“effective_date_from”(edf) 大于号代表“effective_date_to”(edt) 破折号代表 edf 之间的“有效”日期和 edt

      drb     dre
<---> | | case 1: edt < drb
<---|----> | case 2: drb between edf and edt
<--|-------|----> case 3: edf < drb AND edt > dre
| <---> | case 4: edf > drb AND edt < dre
| <--|---> case 5: edf between drb and dre AND edt > dre
| | <---> case 6: edf > dre
| |
<---> | case e1: edt = drb
<--|-------> case e2: edf > drb AND edt = dre
<---> | case e3: edf = drb and edt < dre
<-------> case e4: edf = drb and edt = dre
<-------|--> case e5: edf = drb and edt > dre
| <---> case e6: edf > drb AND edt = dre
| <---> case e7: edf = dre

我认为您要求返回满足情况 2 到 5 以及边缘情况 e1 到 e6 的行,这是除了情况 1、6 和 e7 之外的所有情况。

如果我们可以编写一个谓词来测试案例 1 和案例 6,然后否定它,它应该会为我们提供您想要的结果。像这样:

处理日期时间并考虑时间分量:

  WHERE NOT ( effective_date_to < drb OR effective_date_from >= dre )

(生成 drbdre(日期范围开始和日期范围结束)的表达式显示在我的原始答案中。)

同时返回同时包含 effective_date_from 的行和 effective_date_to为 NULL,我们可以添加一个单独的条件来处理这种情况。

使用内联 View 提供这些表达式,我们在答案的顶部获得了 SQL。

我之前搁置了奇怪的案例,比如effective_date_from > effective_date_to ;您必须弄清楚这些行是否有效,以及返回这些行的条件。


原始答案:

这可以在 OracleMySQL 中实现。我使用的方法是首先生成每个季度相对于当前日期的“开始日期”。我们可以在谓词中引用这些日期值(或返回日期值的表达式)。

要在 MySQL 中导出季度的“开始日期”,我们可以使用 QUARTER()功能。 (此函数从指定的 DATE 值返回 1 到 4 之间的整数值。结合 YEAR 和 MAKEDATE 函数,我们可以从当前系统日期生成每个相关季度的“开始日期”,如下所示:

SELECT MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-0 QUARTER AS next_q
, MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-1 QUARTER AS this_q
, MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-2 QUARTER AS prev_q

next_q this_q prev_q
---------- ---------- ------------
2013-10-01 2013-07-01 2013-04-01

一旦我们有了这些日期值,就很简单了。要仅获取特定日期列(下例中的 mydate)的值在上一季度或当前季度内的行,我们只需将该日期列与上面的两个表达式进行比较:

WHERE mydate >= MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-2 QUARTER
AND mydate < MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-0 QUARTER

Oracle 中,方法是相同的。不同之处在于我们如何得出相关季度的开始日期。在 Oracle 中,我们可以使用如下表达式:

-- ALTER SESSION SET nls_date_format = 'YYYY-MM-DD'; 

SELECT ADD_MONTHS(TRUNC(SYSDATE,'Q'),3) AS next_q
, ADD_MONTHS(TRUNC(SYSDATE,'Q'),0) AS this_q
, ADD_MONTHS(TRUNC(SYSDATE,'Q'),-3) AS prev_q
FROM DUAL

NEXT_Q THIS_Q PREV_Q
---------- ---------- ------------
2013-10-01 2013-07-01 2013-04-01

因此,要获取值为mydate 的行在当前或上一季度,我们将该列与其中两个表达式进行比较:

WHERE mydate >= ADD_MONTHS(TRUNC(SYSDATE,'Q'),-3)
AND mydate < ADD_MONTHS(TRUNC(SYSDATE,'Q'),3)

(大于或等于上一季度的开始日期,且小于下一季度的开始日期)。


使用这些“开始日期”的一种稍微不同的方法是使用内联 View 返回日期值;这给了我们一个单独的查询,我们可以测试,我们可以为表达式分配列名。在这里,我使用别名 dr内联 View 的(日期范围):

甲骨文

FROM mytable t
JOIN ( SELECT ADD_MONTHS(TRUNC(SYSDATE,'Q'),3) AS bd_next_qtr
, ADD_MONTHS(TRUNC(SYSDATE,'Q'),-3) AS bd_prev_qtr
FROM DUAL
) dr
ON t.mydate >= dr.bd_prev_qtr
AND t.mydate < dr.bd_next_qtr

MySQL

FROM mytable t
JOIN ( SELECT MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-2 QUARTER AS bd_next_qtr
, MAKEDATE(YEAR(NOW()),1) + INTERVAL QUARTER(NOW())-0 QUARTER AS bd_prev_qtr
) dr
ON t.mydate >= dr.bd_prev_qtr
AND t.mydate < dr.bd_next_qtr

关于sql - 如何使用 SQL 从数据库中选择最近 2 个季度的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17930802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com