Мне нужно получить серию дат, используя день недели и время как единственный бит информации.MYSQL Получить дату с текущего года, текущего месяца и дня переменной
Мне известно об обратном этой операции, то есть используется WEEKDAY (дата) или DAYOFWEEK (дата), но это не то, что мне нужно.
У меня есть таблица, которая выглядит так, которая будет непрерывно сканироваться и сравниваться с текущей датой.
+----+---------+----------+----------+
| id | weekday | start | end |
+----+---------+----------+----------+
| 1 | 1 | 09:00:00 | 17:00:00 |
| 2 | 2 | 09:00:00 | 17:00:00 |
| 3 | 3 | 09:00:00 | 17:00:00 |
| 4 | 4 | 23:00:00 | 17:00:00 |
| 5 | 5 | 18:00:00 | 23:00:00 |
| 6 | 6 | 00:00:00 | 00:00:00 |
| 7 | 7 | 00:00:00 | 01:00:00 |
+----+---------+----------+----------+
Выше была простая версия, я ожидаю, что эта таблица будет иметь сотни или тысячи возможных итераций. Как отмечалось в 4-м ряду, время может также переходить в полночь, и я должен компенсировать это.
Мне нужен запрос, который предоставит мне следующие результирующие наборы, и у меня возникнут проблемы с блокировкой даты, основанной на текущем году, месяце и прошедшем дне недели из столбца буднего дня.
Пример набора результатов:
+---------------------+---------------------+
| start | end |
+---------------------+---------------------+
| 2013-06-24 09:00:00 | 2013-06-24 17:00:00 |
| 2013-06-25 09:00:00 | 2013-06-25 17:00:00 |
| 2013-06-26 09:00:00 | 2013-06-26 17:00:00 |
| 2013-06-27 23:00:00 | 2013-06-28 17:00:00 | # <---- Notice the date difference here
| 2013-06-28 18:00:00 | 2013-06-28 23:00:00 |
| 2013-06-29 00:00:00 | 2013-06-30 00:00:00 | # <---- Also here, the span is 24 hours
| 2013-06-30 00:00:00 | 2013-06-30 01:00:00 |
+---------------------+---------------------+
Любая помощь будет оценена, я получил как можно ближе, чтобы получить только дата, однако, это создает некоторые проблемы для меня, так как эти даты позже должны быть преобразованы , поэтому мне нужен массив из них, а не только текущий день.
Edit: Добавлено мой текущий код: Хотя я не считаю, что это вполне движется в правильном направлении
SELECT TIMESTAMP(IF (end < start,
CURRENT_DATE,
SUBDATE(CURRENT_DATE, 1)),
start) AS 'start',
TIMESTAMP(IF (end < start,
CURRENT_DATE,
SUBDATE(CURRENT_DATE, 1))
end) AS 'end',
FROM shift
И результат:
+---------------------+---------------------+
| start | end |
+---------------------+---------------------+
| 2013-06-27 23:00:00 | 2013-06-28 17:00:00 |
| 2013-06-28 18:00:00 | 2013-06-28 23:00:00 | # Needs the rest of the dates of the week
+---------------------+---------------------+
ВТОРОЙ EDIT
Благодаря помощи нижеподписавшихся, я пришел к следующему запросу, movi но некоторые из них выразили озабоченность дизайном, и я буду запускать некоторые тесты, прежде чем я соглашусь на ответ. Если есть лучший способ сделать это, мне было бы очень интересно услышать это!
Я полагаю, что лучше всего, когда месяц меняется на полпути через запрос, используя день недели, чтобы определить разницу, может быть, хлопотно.
Запрос:
SELECT @diff:=(CAST(weekday AS SIGNED) - (WEEKDAY(CURRENT_DATE) + 1)) as 'diff',
@date:=DATE_ADD(CURRENT_DATE, INTERVAL @diff DAY) as 'start_date',
TIMESTAMP(@date, start) AS 'start',
TIMESTAMP(IF (end <= start,
DATE_ADD(@date, INTERVAL 1 DAY),
@date),
end) AS 'end'
FROM shift
Результат:
+------+------------+---------------------+---------------------+
| diff | start_date | start | end |
+------+------------+---------------------+---------------------+
| -4 | 2013-06-24 | 2013-06-24 09:00:00 | 2013-06-24 17:00:00 |
| -3 | 2013-06-25 | 2013-06-25 09:00:00 | 2013-06-25 17:00:00 |
| -2 | 2013-06-26 | 2013-06-26 09:00:00 | 2013-06-26 17:00:00 |
| -1 | 2013-06-27 | 2013-06-27 23:00:00 | 2013-06-28 17:00:00 |
| 0 | 2013-06-28 | 2013-06-28 18:00:00 | 2013-06-28 23:00:00 |
| 1 | 2013-06-29 | 2013-06-29 00:00:00 | 2013-06-30 00:00:00 |
| 2 | 2013-06-30 | 2013-06-30 00:00:00 | 2013-06-30 10:00:00 |
+------+------------+---------------------+---------------------+
Третьи Редактировать
Я тестировал выше запрос в течение периодов, которые охватывают через начало и окончание месяца, и нашли его чтобы быть подходящим для его цели, я переведу вышеуказанный запрос, а также некоторые примечания к ответу в надежде, что кто-то может найти это полезным в будущее.
В этой заметке я также расскажу о различных ошибках и рекомендациях от различных комментаторов, снова благодаря всем, кто нашел время, чтобы помочь.
Пожалуйста, покажите, что вы пробовали, поэтому мы можем помочь вам исправить это, а не писать код для вас. – Barmar
Я не писал, что у меня было до сих пор, потому что я не думаю, что это направлено в правильном направлении, и я действительно не собирался писать другим своим кодом для меня :) Однако, поскольку вы спросили, вот оно. –
Расчет части даты 'end' должен добавить 1, если' end
Barmar