一尘不染

MySQL中PostgreSQL的date_trunc

mysql

最近,我对PostgreSQL(使用8.2)非常熟悉,发现date_trunc函数对于轻松匹配某些天/月/等之间的时间戳非常有用。我认为,该功能的真正有用之处在于它可以将输出保持为时间戳格式。

我不得不切换到mySQL(5.0)并找到一些日期功能,而这些功能在比较中是比较缺乏的。提取函数似乎很有用,我发现的日期函数解决了我的一些问题,但是有没有办法复制PostgreSQL的date_trunc?

以下是一个示例,该示例说明了我过去如何使用date_trunc将查询的时间戳与包括当前月份在内的最近4个月进行匹配,但前提是已经有一个星期进入了本月:

WHERE date_trunc('month', QUERY_DATE) BETWEEN 
    date_trunc('month', now()) - INTERVAL '4 MONTH' AND 
    date_trunc('month', now() - INTERVAL '1 WEEK')

我不知道如何在mySQL中重新创建这样的规定。所以,最后我的问题是,是否可以通过尝试复制date_trunc(以及如何)在mySQL中完成这种查询,或者是否需要以不同的方式开始研究这些类型的查询才能使它们工作在mySQL(以及有关如何做到这一点的建议)?


阅读 1349

收藏
2020-05-17

共1个答案

一尘不染

提取函数似乎很有用,我发现的日期函数解决了我的一些问题,但是有没有办法复制PostgreSQL的date_trunc?

确实,EXTRACT看起来这将是此特定情况下最接近的匹配项。

您在PG中的原始代码:

WHERE date_trunc('month', QUERY_DATE) BETWEEN 
    date_trunc('month', now()) - INTERVAL '4 MONTH' AND 
    date_trunc('month', now() - INTERVAL '1 WEEK')

使用EXTRACT

WHERE EXTRACT(YEAR_MONTH FROM QUERY_DATE)
      BETWEEN
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 4 MONTH)
      AND
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 1 WEEK)

尽管在功能上应该相同,但这实际上是在进行比较之前将日期整理为YYYYMM字符串。

另一种选择是使用DATE_FORMAT重建日期字符串并将其强制到月初:

WHERE DATE_FORMAT(QUERY_DATE, '%Y-%m-01')
      BETWEEN
          DATE_FORMAT(NOW() - INTERVAL 4 MONTH, '%Y-%m-01')
      AND
          DATE_FORMAT(NOW() - INTERVAL 1 WEEK, '%Y-%m-01')

另外,请注意,即使对字段进行了索引,MySQL在处理日期范围方面也确实很差。如果您不小心的话,最终可能会进行全表扫描。

2020-05-17