0

只是好奇是否有人可以就这个使用 MySQL 查找生日的问题给我一些指导。

我目前有一个设置的“日历”,它显示该月前 1 个月 + 3 天和该月后 3 天。

我遇到了一个当前出现的问题,因为过去 3 天的“年份”不一样,因为它将是 2013 年。所以我从 MySQL 中选择的代码是这样的

SELECT * FROM contacts WHERE userId = '23' AND Month(dob) IN('12', '01', '01')

现在我需要得到一个更好的日期比较,我认为。我的代码是我有 2 个日期 (2012-12-01) - (2013-01-30)

我知道有人问过这样的问题,但我找不到任何“体面”的东西......如果可能的话,你能帮助我,将不胜感激。

简而言之,我认为我只需要一种更好的方法来“查询”我的日期......提前致谢!

4

2 回答 2

1

您可以像这样查询范围内的日期:

 SELECT * 
   FROM contacts
  WHERE dob >= :first_date - INTERVAL 3 DAY
    AND dob < :first_date + INTERVAL 1 MONTH + INTERVAL 3 DAY + INTERVAL 1 DAY

有一点点猴子生意

   dob < (something)

加入额外的一天,并使用<而不是<=. 那是因为DATETIME值在他们的时间里不一定有午夜。因此,我们希望在第二天午夜之前包含所有内容。

除此之外,此查询查找日期在指定范围内的所有行。

如果您正在使用当前日期,正如 Algomorph 所提到的,您可以像这样将当前日期截断为当前月份的第一天。

  CAST(DATE_FORMAT(CURRENT_DATE,'%Y-%c-01') AS DATE)

这会让你得到这样的查询。

 SELECT * 
   FROM contacts
  WHERE dob >= CAST(DATE_FORMAT(CURRENT_DATE,'%Y-%c-01') AS DATETIME) 
                          - INTERVAL 3 DAY
    AND dob < CAST(DATE_FORMAT(CURRENT_DATE,'%Y-%c-01') AS DATETIME)
                           + INTERVAL 1 MONTH + INTERVAL 3 DAY + INTERVAL 1 DAY
于 2012-12-15T02:09:35.183 回答
1

尝试类似:

SELECT * 
FROM contacts 
WHERE userId = '23' 
   AND dob BETWEEN 
     (CURRENT_DATE - INTERVAL (DAYOFMONTH(CURRENT_DATE)+3) DAY) 
     AND ((CURRENT_DATE + INTERVAL 1 MONTH) + INTERVAL 3 DAY);

免责声明:这是我的想法,所以请测试语法。注意:这是假设您的 [dob] 字段仅是 DATE,而不是 DATETIME。如果使用 DATETIME/TIMESTAMP,则转换为 DATE 或相应地调整上限和下限

于 2012-12-15T02:14:15.780 回答