我正在尝试解决一项任务:我有一张表格,其中包含有关船只战斗的信息。战斗由名称和日期组成。问题是在战斗发生的那个月的最后一个星期五 。
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不可用
答案 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;