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

标签 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'

我以为一定有一个最大日期之类的,但我的代码是错误的。

结果应该是这样的:

请帮忙!!

附言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/

相关文章:

php - PHP MySQL 查询中的 For 循环和变量

php - 根据主机连接到数据库

javascript:比较不同时区的日期

MySQL 更新语句未按预期工作

mysql - 在 When 情况下按 ASC 排序

javascript - 在 Javascript 中使用不同时区

SQL 选择特定日期格式 dd/mm/YYYY hh :mm:ss

c# - asp.net中如何更改日期字符串的格式

MySQL : group records by datetime ignoring the "seconds"

mysql - 如何向带有外键的表中插入数据