首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:需要计算一个月的最后一个星期五

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

Stack Overflow用户
提问于 2015-01-22 21:55:35
回答 1查看 726关注 0票数 2

我正在努力解决一个任务:我有一张表格,里面有关于舰艇战斗的信息。战斗是由名称和date组成的。问题是要让在这个月的最后一个星期五,当战斗发生的时候。

代码语言:javascript
复制
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不可用

EN

回答 1

Stack Overflow用户

发布于 2015-01-22 22:21:52

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

你想要的那一天是4号(在MySQL周日为0)。

所以你想要一个月的最后一天,如果这个月的最后一天是4;如果这个月的最后一天是5,你想要一个早1天的日期;如果这个月的日期是3,你想要一个1天后的日期,但那是不可能的(这个月的结束),所以你真的需要一个六天前的日期。

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

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
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 |
+------------+

那么,您的查询将变成如下所示:

代码语言:javascript
复制
SELECT `name`, `date`,
    DATE_SUB(LAST_DAY(`date`),
       INTERVAL ((WEEKDAY(LAST_DAY(`date`))+7-4))%7 DAY) AS friday
FROM battles;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28099404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档