【问题标题】:SQLite - Negative value by substracting months of different yearsSQLite - 通过减去不同年份的月份得出的负值
【发布时间】:2013-02-02 15:17:58
【问题描述】:

我正在尝试检索计算的月份值:

SELECT strftime('%m', 'now') - strftime('%m', e.date) AS something FROM ...

但这是我得到的结果和我真正想要的:

NOW - 2012-02-03 = 0 // want 11
NOW - 2012-11-02 = -9 // want 3
NOW - 2012-02-02 = 0 // want 12
NOW - 2012-01-02 = 1 // want 13

正如我所见,我几乎可以通过 sqlResult + 12 获得正确的值(第一个示例除外),但有没有办法直接在 SQL 语句中实现这一点并在每种情况下获得准确的值?

编辑:最后是解决方案

SELECT CAST ((julianday('now') - julianday(e.date_retour)) / 30 AS integer) AS something

【问题讨论】:

    标签: sql sqlite date


    【解决方案1】:

    您需要考虑年份。你可以这样做:

    select strftime('%Y', 'now')*12+strftime('%m', 'now') -
           (strftime('%Y', e.date)*12+strftime('%m', e.date))
    

    月份返回一年中的月份。因此,像 2(2 月)到 9(9 月)这样的数字会产生负数也就不足为奇了。

    要处理月份中的某一天,我认为您必须自己处理日期算术:

    select (strftime('%Y', 'now')*12+strftime('%m', 'now') -
            (strftime('%Y', e.date)*12+strftime('%m', e.date))
           ) -
           (case when strftime('%d', 'now') < strftime('%d', e.date) then 0 else 1 end)
    

    SQLite 能够为日期添加月份。不幸的是,它似乎无法计算日期之间的月差。

    【讨论】:

    • 除了第一个例子外它都有效:) 它给了我 12 而不是 11。
    【解决方案2】:

    您并没有真正考虑两个月之间的差异,而是考虑他们的年份。

    所以你需要这样做:

    SQLite (SQL.js) Demo

    SELECT round((julianday(Date('now')) - 
            julianday(Dates))/30) as MonthsDiff
    from demo;
    
    
    | MonthsDiff |
    --------------
    |       11.0 |
    |        2.0 |
    

    【讨论】:

    • 几乎完美,只是它不适用于第三个示例......我不明白,因为它是最简单的!?
    • 让我用你所有的样本数据试一试:)
    • 仍然不完美,因为它给了我 11 而不是第 3 种情况的 12:/ 可能是因为你 / by 30 但 30 不是一个月中天数的完美平均值。
    • 我怀疑是这种情况.. 这似乎是一个错误:密切注意日期 2012-01-08 和 2012-01-02...sqlfiddle.com/#!5/2c825/1
    • 所以没有round() 我得到了正确的值,但我不关心 ,... 所以你知道如何截断它吗?
    【解决方案3】:

    你得到了奇怪的数字,因为你要求 strftime 函数只返回月份,然后你只减去月份......

    你这样做怎么样?

    SELECT strftime('%s', date()) - strftime('%s', '2012-03-03') as blah
    

    这将减去 unix 时间戳,然后您可以将其转换回可读的月份或其他...

    或者这可以给你天数......

    SELECT julianday(date()) - julianday('2012-03-03') as blah
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多