Диапазон дат недели

Имеется таблица объектов, в которой хранятся данные об объектах недвижимости. Мне нужно использовать запрос для вычисления нового поля, которое будет отображать диапазон дат с понедельника по воскресенье, включая дату создания объекта (например, «2020-11-16 - 2020-11-22»)

create table objects(
   object_id int NOT NULL PRIMARY KEY ,
city_id int not null ,
price int ,
area_total int ,
status varchar(50) ,
class varchar(50) ,
action varchar(50) ,
date_create timestamp,
FOREIGN KEY(city_id) references avg_price_square_city(city_id)
);

Данные в таблице:

INSERT INTO objects (object_id, city_id, price, area_total, status, class, action, date_create) 
   VALUES (1, 1, 4600000, 72, 'active', 'Secondary', 'Sale', '2022-05-12 21:49:34');
INSERT INTO objects (object_id, city_id, price, area_total, status, class, action, date_create) 
   VALUES (2, 2, 5400000, 84, 'active', 'Secondary', 'Sale', '2022-05-19 21:49:35');

Запрос должен отображать два поля: номер объекта и диапазон, включающий дату его создания. Как это может быть сделано ? P.S. Написал такой запрос,а он ругается на знак "-":

SET @WeekRangeStart  ='2022/05/10';
SET @WeekRangeEnd  = '2022/05/17';
select object_id,@range := @WeekRangeStart '-' @WeekRangeEnd
FROM objects where @range = @WeekRangeStart and date_create between @WeekRangeStart and @WeekRangeEnd
UNION
select object_id,@range from objects where @`range` = @WeekRangeEnd;

Ошибка: [42000][1064] У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с объектами @WeekRangeEnd FROM, где @range = @WeekRangeStart и date_create betwee в строке 1

Я хочу получить в запросе:

object_id  @range
1          2022/05/10 - 2022/05/17

Столбец @range должен содержать дату из «date_create».

"но он ругается на знак "-"" Пожалуйста, добавьте полное сообщение об ошибке, которое предоставляет MySQL. (Но вы не можете объединять такие строки, вы должны использовать: CONCAT(@WeekRangeStart, '-', @WeekRangeEnd))

Luuk 07.05.2022 09:23

Примечание: ваша логика SQL совершенно неверна... Можете ли вы добавить ожидаемый результат этого запроса?

Luuk 07.05.2022 09:29

Я исправил ошибки со своей стороны

Ibr 07.05.2022 09:38
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
SET @WeekRangeStart  = CAST('2022/05/10' as DATE);
SET @WeekRangeEnd  = CAST('2022/05/17' as DATE);
SET @range = CONCAT(@WeekRangeStart,' - ',@WeekRangeEnd) ;
-- select @range;
select 
   object_id,
   @range
FROM objects 
where DATE(date_create) between @WeekRangeStart and @WeekRangeEnd
UNION
select object_id,@range from objects 
;

Дает следующий результат:

object_id@диапазон
12022-05-10 - 2022-05-17
22022-05-10 - 2022-05-17
  • Этот результат является выводом части SQL, которая помещается после UNION. Потому что date_create не находится между вашим WeekRangeStart и WeekRangeEnd.
    Вы должны потратить некоторое время и прочитать документацию СОЮЗ.

  • Переменная @range вычисляется перед оператором SQL, потому что значение является константой.

см.: DBFIDDLE

ПРИМЕЧАНИЕ. Вы должны попытаться использовать один и тот же формат даты везде, а не смешивать даты, такие как '2022-05-19 21:49:35' и 2022/05/10. Используйте - ИЛИ используйте /, но не смешивайте их...

Обновлено: после калибровки "Мне нужно использовать запрос для вычисления нового поля, которое будет отображать диапазон дат с понедельника по воскресенье...":

Вероятно, вы хотели сделать:

SET @WeekDate = CAST('2022/05/10' as DATETIME);

SELECT 
   ADDDATE(@WeekDate, -(DAYOFWEEK(@WeekDate)-1) +1) as Monday,
   DATE_ADD(ADDDATE(@WeekDate, -(DAYOFWEEK(@WeekDate)-1) +9), INTERVAL -1 SECOND) as Sunday;

выход:

ПонедельникВоскресенье
2022-05-09 00:00:002022-05-16 23:59:59
SET @WeekRangeStart = CAST('2022/01/10 00:23:00' as DATETIME); SET @WeekRangeEnd = CAST('2022/01/14 23:23:00' as DATETIME); select object_id, @range := CONCAT(@WeekRangeStart,' - ',@WeekRangeEnd) FROM objects where date(date_create) between @WeekRangeStart and @WeekRangeEnd ; Я исправил ваш запрос и теперь он отображает то, что мне нужно."UNION select object_id,@range from objects" Отображает исходные значения без условий
Ibr 07.05.2022 10:05

Значения для date_create изменились с тех пор, как я скопировал данные, которые используются в DBFIDDLE.... ?

Luuk 07.05.2022 10:16

Ваш запрос все еще неясен (из-за того, что вы используете UNION). Когда вы делаете только select object_id,@range from objects, вы получите те же результаты (при условии, что @range имеет правильное значение)

Luuk 07.05.2022 10:18

Мне нужно использовать запрос для вычисления нового поля, которое будет отображать диапазон дат с понедельника по воскресенье, включая дату создания объекта. Возможно ли это сделать в MySQL?

Ibr 07.05.2022 10:19

51 минуту назад я прокомментировал (по вашему вопросу): «Можете ли вы добавить ожидаемый результат этого запроса?» Теперь вы меняете вопрос, не предоставляя эту информацию? ?

Luuk 07.05.2022 10:22

Другие вопросы по теме