SQLite:选择所有日期 - 值对,其中每个日期与第一个日期之间的距离是特定时间段的倍数

时间:2011-10-11 22:52:25

标签: python sql sqlite date

我正在使用SQLite和Python并尝试获取这些特定日期(和相应的值)。我认为最好的例子解释我正在寻找的东西。 考虑从这些数据中选择:

-(2011-01-02, 4.0)
-(2011-01-14, 5.0)
-(2011-02-02, 5.5)
-(2011-02-07, 6.5)
-(2011-02-12, 7.0)
-(2011-02-15, 4.0)
-(2011-03-02, 2.5)
-(2011-03-09, 3.5)

在第一个日期和我们要查找的所有日期之间的周期距离一个月(或倍数),我们会返回此数据:

-(2011-01-02, 4.0)
-(2011-02-02, 5.5)
-(2011-03-02, 2.5)

我正在寻找一个SQL语句,如果可能的话,它会向我提供这些数据。

其他问题: 如果没有与初始日期完全相差一个月的日期点,我怎样才能在我的数据库中获得最近的日期?

我希望我的解释足够清楚。如果没有,谢谢你说。

1 个答案:

答案 0 :(得分:1)

听起来这对于您的需求来说不是一个足够灵活的解决方案,但是直接回答您的问题,这是一个可以满足您需求的查询。

此外,由于您没有指定表/列名称,因此我使用的测试表名为foo,并且列createdvalue

select
    foo.created, foo.value
from 
    -- Subquery to pick first record to base rest of query on
    (
        select
            created,
            strftime('%d', created) as day
        from
            foo
        order by
            created
        limit 1
    ) as bar

    -- Join all rows in foo that are greater than that found in 'bar'
    -- and has the same day of the month.
    join foo
        on foo.created >= bar.created
           and strftime('%d', foo.created) = bar.day

结果:

2011-01-02|4.0
2011-02-02|5.5
2011-03-02|2.5

注意 - 这可能是相当低效的,因为所有strftime都已完成(我假设这里不能使用任何索引)。

注意2 - 此查询不会处理完全一个月以外的时间间隔,如果两个记录具有相同的日期,则执行任何特殊操作,或者识别何时有数据中的差距(例如:如果缺少2011-02-02日期,它仍会返回2011-03-02日期。