我正在尝试解决一项任务:我有一个包含有关船舶战斗信息的表格。战斗由姓名和日期组成。问题是获取战斗发生月份的最后一个星期五。
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'
我以为一定有一个最大日期之类的,但我的代码是错误的。
结果应该是这样的:
请帮忙!!
附言DATE_FORMAT 不可用
最佳答案
可能的问题:正如 spencer7593 注意到的那样 - 我应该做但没有做 - 您的原始查询根本不是 MySQL。如果您要移植查询,那没问题。否则这个答案将没有帮助,因为它使用了 MySQL 函数。
您想要的日期是数字 4(0 在 MySQL 中是星期日)。
因此,如果月份的最后一天是 4,则需要月份的最后一天;如果一个月中的第几天是 5,你想要一个早 1 天的日期;如果这个月的第几天是 3,你想要一个晚 1 天的日期,但这是不可能的(月末),所以你真的需要一个早 6 天的日期。
这意味着如果天数差为负,您需要它对七进行模数。
然后您可以构建此表达式(@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;
关于MySQL:需要计算一个月的最后一个星期五,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28099404/