我正在努力解决一个任务:我有一张表格,里面有关于舰艇战斗的信息。战斗是由名称和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不可用
发布于 2015-01-22 22:21:52
可能出现的问题:正如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;https://stackoverflow.com/questions/28099404
复制相似问题