【问题标题】:MySQL: need to calculate the last Friday of a monthMySQL:需要计算一个月的最后一个星期五
【发布时间】:2015-03-21 20:56:08
【问题描述】:

我正在尝试解决一项任务:我有一个包含有关舰船战斗信息的表格。战斗由 namedate 组成。问题是要获得战斗发生时每月的最后一个星期五

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 不可用

【问题讨论】:

  • @JohnP 那个帖子是关于 PHP 代码的,这个是纯 MySql。尽管 PHP 选项可能是最容易完成此任务的。
  • 恐怕我的php不强,mysql也不强。而且我不能使用php
  • 您确定此查询是针对 MySQL 的,而不是针对 SQL Server 或其他一些 RDBMS 的吗? (如果是MySQL,什么版本的MySQL支持公用表表达式?)

标签: mysql date


【解决方案1】:

可能的问题:正如 spencer7593 注意到的那样 - 我应该做但没有做 - 您的原始查询根本不是 MySQL。如果您要移植一个查询,那没关系。否则这个答案将没有帮助,因为它使用了 MySQL 函数。

您想要的日期是 4 号(0 是 MySQL 中的星期日)。

因此,如果该月的最后一天是 4,则您需要该月的最后一天;如果该月的日期是 5,您想要一个早于 1 天的日期;如果一个月中的日期是 3,您想要一个晚 1 天的日期,但这是不可能的(月末),所以您确实需要一个早于 6 天的日期。

这意味着如果天数差为负数,您希望它以 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;

【讨论】:

  • @Len_D,你的答案和我的一样,你在我之前回答了。你为什么删除你的答案?据我所知,它是正确的。
  • @spencer7593,我自己的 MySQL(Linux x64 上的 5.6.17)今天给出了 4。 weekday(now()), date_format(now(), '%W') 返回 [ 4, 'Friday' ]。
  • 这并不是说我写的 0 到 7 是正确的 - 实际上是 0 到 6。我编辑了答案。谢谢。
  • @Iserni:我错了,我错误地认为WEEKDAY 是MySQL DAYOFWEEK 函数的同义词。但事实并非如此。 WEEKDAY 返回 0 到 6,DAYOFWEEK(这是我使用的函数)返回 1 到 7。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多