如何查找大于或等于上一年当前月份的所有记录?



我几乎不懂SQL。我正在努力实现以下目标:

例如,下面的表有2个字段

NAME VARCHAR(20)
BDAY TIMESTAMP(6)

我需要找到所有生日是上一年和上一年当前月份的人. 例如,如果我在2021年8月15日运行查询,我需要找到所有具有2020年8月/日期(忽略日期部分)和之前的记录。因此,有些条目可能少于12个月(在上一年的当前月份的查询日期之后的条目),并且需要包含在返回的行中。

如果我有以下记录,并且我在8/15/2021上运行查询

Mark 12/22/2018
Mike 10/15/2019
Joe  07/31/2020
John 08/06/2020
Jill 08/28/2020
Bill 08/31/2020
Jack 09/01/2020
Jeb  08/08/2021

它需要返回以下内容:

Mark 12/22/2018
Mike 10/15/2019
Joe  07/31/2020
John 08/06/2020
Jill 08/28/2020
Bill 08/31/2020

如果我做了如下操作,

select * from BDAY where BDAY < add_months(systimestamp,-12) order by BDAY desc;

将排除在查询运行日期之后的当前月份或上一年的条目。我可以使用复杂的查询获得所需的结果,但我想知道是否有更简单的方法来做到这一点,例如oracle函数。

您可以与下个月的第一天进行比较,即11个月前而不是12个月前:

select * from bday where bday<trunc(add_months(sysdate ,-11), 'mm');

完整的测试数据示例:

alter session set nls_date_format='mm/dd/yyyy';
with bday(name, bday) as (
select 'Mark',to_date('12/22/2018','mm/dd/yyyy') from dual union all
select 'Mike',to_date('10/15/2019','mm/dd/yyyy') from dual union all
select 'Joe ',to_date('07/31/2020','mm/dd/yyyy') from dual union all
select 'John',to_date('08/06/2020','mm/dd/yyyy') from dual union all
select 'Jill',to_date('08/28/2020','mm/dd/yyyy') from dual union all
select 'Bill',to_date('08/31/2020','mm/dd/yyyy') from dual union all
select 'Jack',to_date('09/01/2020','mm/dd/yyyy') from dual union all
select 'Jeb ',to_date('08/08/2021','mm/dd/yyyy') from dual
)
select * from bday where bday<trunc(add_months(sysdate ,-11), 'mm');
NAME BDAY
---- ----------
Mark 12/22/2018
Mike 10/15/2019
Joe  07/31/2020
John 08/06/2020
Jill 08/28/2020
Bill 08/31/2020
6 rows selected.

DBFIDDLE: https://dbfiddle.uk/?rdbms=oracle_18&小提琴= b9f4889a47f59f6a48d3fb2d0a212617

最新更新