MySQL:需要计算一个月的最后一个星期五

时间:2015-01-22 21:55:35

标签: mysql date

我正在尝试解决一项任务:我有一张表格,其中包含有关船只战斗的信息。战斗由名称日期组成。问题是在战斗发生的那个月的最后一个星期五

WITH num(n) AS(
SELECT 0 
UNION ALL
SELECT n+1 FROM num 
WHERE n < 31),
dat AS (
SELECT DATEADD(dd,  n,  CAST(battles.date AS DATE)) AS day, 
    dateadd(dd, 0, cast(battles.date as date)) as fight, 
    name FROM num,battles)
SELECT name, fight, max(day) FROM dat WHERE DATENAME(dw, day) = 'friday'

我认为必须有最大日期或其他什么,但我的代码是错误的。

结果应如下所示:

请帮助!!

P.S。 DATE_FORMAT不可用

1 个答案:

答案 0 :(得分:0)

可能出现的问题:正如spencer7593注意到的那样 - 而且我应该做的并且没有 - 你的原始查询根本不是MySQL 。如果您正在移植可以查询的查询。否则这个答案将没有用,因为它使用了MySQL函数。

你想要的那一天是4号(在MySQL中是0星期日)。

如果一个月的最后一天是4,那么你想要一个月的最后一天;如果这个月的日期是5,你想要一个提前1天的日期;如果一个月中的某一天是3,那么你想要的是1天后的日期,但那是不可能的(月末),所以你真的需要提前六天预约。

这意味着如果日数差异为负数,则需要以7为模。

然后您可以构建此表达式(@DATE是您的日期;我使用假日期进行测试)

SET @DATE='2015-02-18';
DATE_SUB(LAST_DAY(@DATE), INTERVAL ((WEEKDAY(LAST_DAY(@DATE))+7-4))%7 DAY);

它需要一个月的最后一天(LASTDAY(@DATE)),然后计算其工作日,得到一个从0到6的数字。加减7以确保减去后的积极性;然后减去所需的日期数,在这种情况下为星期五4。

结果,模7,是从最后一天的日数到想要的日数的差异(总是正数)。由于DATE_SUB(date, 0)会返回参数日期,因此我们无需使用IF

SET @DATE='1962-10-20';
SELECT DATE_SUB(LAST_DAY(@DATE), INTERVAL ((WEEKDAY(LAST_DAY(@DATE))+7-4))%7 DAY) AS friday;
+------------+
| friday     |
+------------+
| 1962-10-26 |
+------------+

您的查询将变为类似:

SELECT `name`, `date`,
    DATE_SUB(LAST_DAY(`date`),
       INTERVAL ((WEEKDAY(LAST_DAY(`date`))+7-4))%7 DAY) AS friday
FROM battles;