【问题标题】:SQL select all data that past 45 daysSQL 选择过去 45 天的所有数据
【发布时间】:2018-05-10 09:41:00
【问题描述】:

我有带有日期字段的“警报”表 - targetDate。

我想选择过去 45 天的所有数据。

我尝试了下面的代码,但它没有返回任何结果...

SELECT userID, refID, `targetDate`
FROM alerts
WHERE type = 'travelSoon'
AND DATEDIFF( CURDATE( ) , targetDate ) > 45

表格

 id     userID  type    refID   createDate  targetDate  lastSendDate    sent    valid
1   26  travelSoon  NO  2018-05-02 13:54:25 0000-00-00  2018-05-02 00:00:00 0   1
2   26  travelSoon  NO  2018-05-02 13:55:50 2018-06-01  0000-00-00 00:00:00 0   1
3   26  travelSoon  DK  2018-05-02 13:56:12 2018-12-01  0000-00-00 00:00:00 0   1
4   26  travelSoon      2018-05-02 13:59:50 0000-00-00  0000-00-00 00:00:00 0   1
5   26  travelSoon      2018-05-02 14:00:09 2018-08-01  0000-00-00 00:00:00 0   1
6   26  travelSoon  DK  2018-05-02 14:00:48 2018-08-01  0000-00-00 00:00:00 0   1
7   26  travelSoon      2018-05-02 16:45:18 2018-05-01  0000-00-00 00:00:00 0   1
8   26  travelSoon  RO  2018-05-02 16:45:45 2018-04-01  0000-00-00 00:00:00 0   1

【问题讨论】:

  • 什么是 targetDate 数据类型?
  • @DT - 日期 ....
  • MySQL、SQL Server、甲骨文...?
  • NOW() 函数返回 MySQL 中的当前日期。使用它和 45 天的硬编码时间戳来获取最旧的可能条目的时间戳。然后 SELECT * FROM table WHERE timestamp > var.

标签: mysql sql


【解决方案1】:

使用DATEDIFF() 是个坏主意。它阻止了使用索引的能力,并且有一个替代方案不会......

SELECT *
  FROM alerts
 WHERE type = 'travelSoon'

   AND targetDate >= DATEADD(DAY, -45, GETDATE())    -- SQL Server

   AND targetDate >= CURDATE() - INTERVAL 45 DAY     -- MySQL

http://www.sqlfiddle.com/#!9/4ecdc0/6

【讨论】:

    【解决方案2】:

    在MSSQL中DATEDIFF(interval, date1, date2)返回date2 - date1的区间。

    间隔应从此列表中选择:

    - year, yyyy, yy = Year
    - quarter, qq, q = Quarter
    - month, mm, m = month
    - dayofyear = Day of the year
    - day, dy, y = Day
    - week, ww, wk = Week
    - weekday, dw, w = Weekday
    - hour, hh = hour
    - minute, mi, n = Minute
    - second, ss, s = Second
    - millisecond, ms = Millisecond`
    

    然后使用:

    SELECT userID, refID, `targetDate`
    FROM alerts
    WHERE type = 'travelSoon'
    AND DATEDIFF(day, targetDate, GETDATE() ) > 45
    

    对于 MySQL,您可以使用 TIMESTAMPDIFF(unit,date1,date2),它返回的间隔为 date1 - date2

    unit可以从MICROSECOND (microseconds), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.中选择

    SELECT userID, refID, `targetDate`
    FROM alerts
    WHERE type = 'travelSoon'
    AND TIMESTAMPDIFF(DAY, CURDATE( ), targetDate) > 45
    

    【讨论】:

    • 我尝试了您的示例并收到此错误:#1582 - 调用本机函数 'DATEDIFF' 时参数计数不正确
    • 在 mysql datediff 中只需要 2 个参数而不是 day 参数
    【解决方案3】:

    ANSI 标准语法是:

    SELECT userID, refID, `targetDate`
    FROM alerts
    WHERE type = 'travelSoon' AND
          targetDate >= CURRENT_DATE - interval '45 day' AND
          targetDate <= CURRENT_DATE;
    

    在 MySQL 中(您的语法建议:

    SELECT userID, refID, `targetDate`
    FROM alerts
    WHERE type = 'travelSoon' AND
          targetDate >= CURRENT_DATE - interval 45 day AND
          targetDate <= CURRENT_DATE;
    

    【讨论】:

      【解决方案4】:

      试试这个...

      SELECT userid, refid, `targetdate` 
      FROM   alerts 
      WHERE  type = 'travelSoon' 
             AND Datediff(Curdate(), targetDate) < 45 -- or <=45 
             AND Datediff(Curdate(), targetDate) > 0 
      

      在线演示:http://www.sqlfiddle.com/#!9/4ecdc0/4/0

      如果您只使用Datediff(Curdate(), targetDate) &lt; 45 条件,它可能会返回过去和未来的日期。请参考下表。

      Today: May 10, 2018
      
      +----+-------------+
      | id | targetDate  |  DATEDIFF(CURDATE(), targetDate) 
      +----+-------------+
      |  2 | ????-??-?? |                             -22 
      |  3 | ????-??-?? |                            -205 
      |  5 | ????-??-?? |                             -83 
      |  6 | ????-??-?? |                             -83 
      |  7 | 2018-05-01  |                               9 
      |  8 | 2018-04-01  |                              39 
      +----+-------------+ 
      

      为避免这种情况,您可以使用其他类似的条件...

      Datediff(Curdate(), targetDate) > 0
      

      【讨论】:

      • 嗨 DT - 这很好,但我只想要超过 45 天的数据。不在 0-45 之间。这意味着三月、二月、一月(2018 年)
      • 这行得通吗? TIMESTAMPDIFF(DAY , targetDate, CURDATE( ) ) &gt;45 ?
      • @Roi,如果是这样的话,是的。你的情况会起作用。顺便说一句,在您的示例中,没有符合该条件的数据,对吗?参考这个:sqlfiddle.com/#!9/6bfb49/16/0
      【解决方案5】:
      选择用户ID、参考ID、`targetDate`
      来自警报
      WHERE type = 'travelSoon'
      AND targetDate >= ( CURDATE() - INTERVAL 45 DAY )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 2011-08-24
        • 2015-12-25
        • 1970-01-01
        相关资源
        最近更新 更多