首页 > 解决方案 > Sqlite3:如何将月/年的范围作为单独的文本字段进行匹配

问题描述

这是 sqlite3,它不包括我在此处阅读的其他 SQL 实现的其他解决方案。

我有一个表“DR”,其中除其他数据外,还有“月”列(没有零填充的 1-12)和“年”(yyyy)列,它们都是文本列。

我想检索月/年在两个特定配对之间的所有行,例如从 2017 年第 6 个月到 2020 年第 4 个月。这 4 个值也作为文本输入(来自 python),当月没有填充. 我想确保也处理不到一整年的情况,例如 2017 年第 2 个月到 2017 年第 10 个月。

我想出了如何通过蛮力使用数量荒谬的 OR 并且从未触及实际的日期相关函数来做到这一点,但我想知道是否有更优雅的方法来利用 sql 实际上理解日期大于或小于具有跨年份边界滚动月份数的另一个日期。

感谢您提供任何帮助!

标签: pythonsqlitedate-range

解决方案


如果正确理解您的问题 - 当您的表格仅包含月份和年份数字时,您希望应用日期范围过滤器?

您可以创建一个辅助“日期”表来加入您的 CR 表:

create table digits (value integer);

-- create auxiliary digits table (for generating dates)
insert into digits values (1),(2),(3),(4),(5),(6),(7),(8),(9);

create table numbers (value integer);

-- create auxiliary numbers table (for generating dates)
insert into numbers (value)
select d1.value + d2.value * 10 + d3.value *100 as value
from digits as d1
    cross join digits as d2
    cross join digits as d3;

-- create auxliary dates table
create table dates (month_begin_date, month_number, year_number);
insert into dates (
    month_begin_date
    ,month_number
    ,year_number)
select date('now', '-'|| value || ' day')
, cast(strftime('%m',date('now', '-'|| value || ' day')) as integer) as month_number
, cast(strftime('%Y',date('now', '-'|| value || ' day')) as Integer) as year_number
from numbers
where cast(strftime('%d',date('now', '-'|| value || ' day')) as integer) = 1;

create table CR (month_number integer, year_number integer, some_column varchar(100));

insert into CR values 
    (1, 2020, 'a'),
    (2, 2020, 'b'),
    (3, 2020, 'c'),
    (4, 2020, 'd');

-- join 'CR' table to auxiliary table here for final filtering
select dates.month_begin_date, dates.month_number, dates.year_number, CR.some_column
from dates
    inner join CR 
        on CR.month_number = dates.month_number
        and CR.year_number = dates.year_number
where dates.month_begin_date > '1/1/2020' and dates.month_begin_date < '3/1/2020';

推荐阅读