2015-01-22 3 views
2

Я пытаюсь решить задачу: у меня есть таблица, содержащая информацию о сражениях кораблей. Битва состоит из имя и дата. Проблема заключается в том, чтобы получить в последнюю пятницу месяца, когда произошло сражение.MySQL: нужно рассчитать последнюю пятницу месяца

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

возможно дубликат [Получить первый или последний пятницу в месяц] (http://stackoverflow.com/questions/924246/get- первый или последний-пятница-в-месяц) – JohnP

+0

@JohnP, что сообщение относится к PHP-коду, это чистый MySql. Хотя вариант PHP может быть самым простым для этой задачи. – Scriptable

+0

Боюсь, что я не сильный в php, а также в mysql. И я не могу использовать php – messier101

ответ

0

Возможная проблема: а spencer7593 заметил - и, как я должен был сделать и не сделал - исходный запрос не является MySQL на всех. Если вы портируете запрос, это нормально. В противном случае этот ответ не будет полезен, так как он использует функции MySQL.

День, когда вы хотите, - это номер 4 (0 - воскресенье в MySQL).

Итак, вы хотите последний день месяца, если последний день месяца равен 4; если день месяца равен 5, вам нужна дата, которая на 1 день раньше; если день месяца - 3, вам нужна дата, которая на 1 день позже, но это невозможно (конец месяца), поэтому вам действительно нужна дата на шесть дней раньше.

Это означает, что если разница в дневном значении отрицательна, вы хотите, чтобы это по модулю семь.

Вы можете построить это выражение (@DATE вашей дата, я использую поддельные даты для тестирования)

SET @DATE='2015-02-18'; 
DATE_SUB(LAST_DAY(@DATE), INTERVAL ((WEEKDAY(LAST_DAY(@DATE))+7-4))%7 DAY); 

Это занимает последний день месяца (LASTDAY(@DATE)), то он вычисляет свой будний день, получение числа от 0 до 6. Добавляет семь, чтобы обеспечить положительность после вычитания; затем вычтите желаемый номер дня, в этом случае 4 для пятницы.

Результат, по модулю семь, является разницей (всегда положительной) от дневного дневного номера до . Требуется daynumber. Поскольку 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; 
+0

@Len_D, ваш ответ такой же, как у меня, и вы ответили передо мной. Почему вы удалили свой ответ?Насколько я вижу, это правильно. – LSerni

+1

ваш более полный ... – glglgl

+0

@ spencer7593, мой собственный MySQL (5.6.17 на Linux x64) дает 4 на сегодня. 'weekday (now()), date_format (now(), '% W')' возвращает [4, 'Friday']. – LSerni

Смежные вопросы