如何查找所有早于或等于上一年当前月份的记录?
Posted
技术标签:
【中文标题】如何查找所有早于或等于上一年当前月份的记录?【英文标题】:How to find all records that are older than or equal to the current month of the previous year? 【发布时间】:2021-08-30 21:23:51 【问题描述】:我几乎不知道 SQL。我正在努力实现以下目标:
例如,我有下表有 2 个字段
NAME VARCHAR(20)
BDAY TIMESTAMP(6)
我需要找出所有的生日是上一年和之前的当前月份。例如,如果我在 2021 年 8 月 15 日运行查询,我需要查找月份/日期为 08/2020(忽略日期部分)及之前的所有记录。因此,某些条目可能少于 12 个月(前一年当前月份的查询日之后的条目)并且需要包含在返回的行中。
如果我有以下记录并且我在 2021 年 8 月 15 日运行查询
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;
它将排除上一年当前月份在查询运行日期之后的条目。我可以使用复杂的查询获得所需的结果,但我想知道是否有更简单的方法可以做到这一点,例如一个预言机函数。
【问题讨论】:
只要使用<trunc(add_months(sysdate ,-11), 'mm')
【参考方案1】:
您可以与下个月的第一天进行比较,即 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&fiddle=b9f4889a47f59f6a48d3fb2d0a212617
【讨论】:
以上是关于如何查找所有早于或等于上一年当前月份的记录?的主要内容,如果未能解决你的问题,请参考以下文章