mysql - SQL:没有年份的两个日期之间的位置?

标签 mysql sql

我正在尝试查询历史数据,我需要仅从 1 个月的时间段返回数据:前 2 周和前 2 周,但我需要年份无关紧要。

因此,如果我今天进行查询,我希望所有具有 date 的行都在 xxxx-06-31 和 xxxx-07-27 之间

在此先感谢您的帮助!

编辑: 我试过两种方法。我认为这两者都不会在新的一年前后奏效。一种是使用 datepart(day),另一种是简单地从日期中减去年份并进行比较。

最佳答案

考虑此问题的最佳方法是将日期转换为 0 到 365 之间的数字,对应于一年中的某一天。然后只需选择此差异小于 14 的日期即可为您提供两周的窗口。

这将在年初或年底崩溃。但简单的模块化算法会给您答案。

幸运的是,MySQL 有DAYOFYEAR(date),所以没那么复杂:

SELECT * FROM tbl t
WHERE 
  MOD(DAYOFYEAR(currdate) - DAYOFYEAR(t.the_date) + 365, 365) <= 14
  OR MOD(DAYOFYEAR(t.the_date) - DAYOFYEAR(currdate) + 365, 365) <= 14

需要额外的 + 365,因为 MySQL 的 MOD 将返回负数。

这个答案没有正确说明闰年。如果当前年份不是闰年并且 currdate 在该年结束后的 14 天内,那么您将错过 1 月中本应包含的一天。如果您关心这一点,则应将 365 替换为 [一年中的天数 - 1]。

关于mysql - SQL:没有年份的两个日期之间的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12417066/

相关文章:

mysql - SQL条件日期

mysql:按用户获取上次对话记录

mysql - 不检查数据类型的安全问题

java - 具有标准的独特功能

sql - SELECT 选择都查看过页面的用户

php - 如果连接存在,mysql更改where子句

mysql - 如何解决GROUP BY列空优先?

php - Mysql从一个表中选择多个id插入到另一个表中

MySQL - 如何删除多对多关系中的相关行

mysql - 如果一个值为 NULL,则获取数据