【问题标题】:Finding the date one month in advance on the same day在同一天找到提前一个月的日期
【发布时间】:2010-07-07 02:53:27
【问题描述】:

在 MySQL 中,我可以执行以下操作:

SELECT DATE_ADD('2010-07-02', INTERVAL 1 MONTH)

然后返回:

2010-08-02

太好了……现在有一个 MySQL 函数,我可以使用它来提前一个月的同一天查找日期。例如,2010 年 7 月 2 日是 2010 年 7 月的第一个星期五。有没有一种简单的方法可以通过 SQL 语句找到 2010 年 8 月的第一个星期五是什么?

【问题讨论】:

  • 希望你看到这个。我的第一次尝试有一个缺陷:)

标签: mysql date


【解决方案1】:

这有点复杂,但这里是:

SELECT IF(MONTH(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) = MONTH('2010-07-02'), 
  DATE_ADD('2010-07-02', INTERVAL 35 DAY),
  DATE_ADD('2010-07-02', INTERVAL 28 DAY));

理由:如果再加上 4 周或 5 周,您仍然是同一天;因为所有月份的长度都在 28 到 35 天之间,如果 4 周后仍然是同一个月,请再增加一周。

更新: 嗯,我没有很好地考虑这一点 - 它适用于一个月的第一个 X,但必须适用于第二个、第三个......(即一个月的第三个 X 可能会返回第二个X 下个月)。尝试#2:

SELECT IF(
  CEIL(DAY(DATE_ADD('2010-07-02', INTERVAL 35 DAY)) / 7) = CEIL(DAY('2010-07-02') / 7), 
  DATE_ADD('2010-07-02', INTERVAL 35 DAY),
  DATE_ADD('2010-07-02', INTERVAL 28 DAY));

基本原理:CEIL(DAY(x) / 7) 是 x 的周数。如果加上 5 周后有所不同,则加上 4 周。

更新 2: 大声笑,我今天很糟糕,我真的应该在发帖之前考虑一下……通常将周定义为周一至周日或周日至周一,而不是从月初开始直到6天后。为了弥补这一点:

SELECT IF(
    CEIL((DAY(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) - DAYOFWEEK('2010-07-02')) / 7)
    = CEIL((DAY('2010-07-02') - DAYOFWEEK('2010-07-02')) / 7), 
  DATE_ADD('2010-07-02', INTERVAL 28 DAY),
  DATE_ADD('2010-07-02', INTERVAL 35 DAY));

【讨论】:

  • 啊,对。我也完全忽略了这一点。我很欣赏后续行动。非常感谢!
  • 是的,没问题。我真的希望不会有第四个:D
  • Update 2 也不能正常工作。第二个“周数”为零(CEIL() 中的语句是否定的)。失败的一个例子:2010-07-06 到 2010-08-10。 2010-07-06 位于本月的第一个星期二。 2010-08-10 位于每月的第二个星期二。
【解决方案2】:

这能解决问题吗?


SELECT DATE_ADD(
            DATE_SUB(
                DATE_ADD('2010-07-06', INTERVAL 1 MONTH),

                INTERVAL DAYOFWEEK(DATE_ADD('2010-07-06', INTERVAL 1 MONTH)) DAY
            ),

            INTERVAL DAYOFWEEK('2010-07-06') DAY
        )

【讨论】:

  • 这似乎不适用于 2010 年 6 月 1 日,但是在我添加代码以添加 7 天后,如果检索到的月份与开始月份在同一个月,事情似乎工作出来更好。到目前为止:p
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2022-11-24
相关资源
最近更新 更多