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

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;

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

【问题讨论】:

只要使用&lt;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

【讨论】:

以上是关于如何查找所有早于或等于上一年当前月份的记录?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 查询相关范围内的日期

如何根据一定的逻辑创建一个检索年份的函数

如果日期早于当前月份,则将日期转换为当前月份的第一天

SQLServer、Oracle获取当前年份的1月到当前月之间的所有月份

s-s-rS 工作日表达

一年又36个旬,想问下SQL SERVER如何判断当前日期是第几个旬