【问题标题】:MySql get rows between date valuesMySql 获取日期值之间的行
【发布时间】:2009-08-26 11:45:25
【问题描述】:

我正在执行以下查询并返回所有行,无论日期如何:

 SELECT DISTINCT p.name, p.category, u.f_name, t.name
 FROM   (
        prizes p, tags t, results r
        )
 LEFT JOIN
        users u
 ON     (r.user_id = u.id)
 LEFT JOIN
        f_tag_lookup tl
 ON     (tl.tag_id = t.id)
 WHERE  r.tag_id = t.id
        AND r.date BETWEEN concat(date_format(LAST_DAY(now() - interval 1 month), '%Y-%m-'),'01') AND last_day(NOW() - INTERVAL 1 MONTH)

r.date 是一个日期时间字段。有三行的日期是上个月的,三行的日期是本月的,但我要找回所有的行?

不胜感激任何指针。我想返回上个月第一天和最后一天之间的结果,即 7 月的所有结果。

谢谢,

【问题讨论】:

    标签: sql mysql date


    【解决方案1】:

    你不能只使用 month() 日期函数吗?

    例如使用 month(date) = month(now()) 作为过滤器。

    如果您有超过一年的数据,您还需要匹配 year(date) = year(now())。

    我不确定性能,但这样表达对我来说似乎更具可读性。

    SELECT DISTINCT p.name, p.category, u.f_name, t.name
    FROM (prizes p, tags t, results r)
    LEFT JOIN users u ON (r.user_id = u.id)
    LEFT JOIN f_tag_lookup tl ON (tl.tag_id = t.id)
    WHERE r.tag_id = t.id AND 
          month(r.date) = month(now()) AND 
          year(r.date) = year(now()) 
    

    【讨论】:

    • MONTH(r.date) = 07 and Year(r.date) = 2009 在性能上不能比 r.date BETWEEN concat(date_format(LAST_DAY(now() -interval 1 个月),'%Y-%m-'),'01') AND last_day(NOW() - INTERVAL 1 MONTH)
    • 也许不是,但是在操作符之间使用恒定的上限可能更适合索引选择
    • 感谢您的回答。所以我会为上个月做month(now() - interval 1 month)?
    【解决方案2】:

    想通了。关于日期的 SQL 很好,但 JOINS 是错误的。感谢您的回复。

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      相关资源
      最近更新 更多