Имеется таблица объектов, в которой хранятся данные об объектах недвижимости. Мне нужно использовать запрос для вычисления нового поля, которое будет отображать диапазон дат с понедельника по воскресенье, включая дату создания объекта (например, «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».
Примечание: ваша логика SQL совершенно неверна... Можете ли вы добавить ожидаемый результат этого запроса?
Я исправил ошибки со своей стороны
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 | @диапазон |
---|---|
1 | 2022-05-10 - 2022-05-17 |
2 | 2022-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:00 | 2022-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" Отображает исходные значения без условий
Значения для date_create
изменились с тех пор, как я скопировал данные, которые используются в DBFIDDLE.... ?
Ваш запрос все еще неясен (из-за того, что вы используете UNION). Когда вы делаете только select object_id,@range from objects
, вы получите те же результаты (при условии, что @range
имеет правильное значение)
Мне нужно использовать запрос для вычисления нового поля, которое будет отображать диапазон дат с понедельника по воскресенье, включая дату создания объекта. Возможно ли это сделать в MySQL?
51 минуту назад я прокомментировал (по вашему вопросу): «Можете ли вы добавить ожидаемый результат этого запроса?» Теперь вы меняете вопрос, не предоставляя эту информацию? ?
"но он ругается на знак "-"" Пожалуйста, добавьте полное сообщение об ошибке, которое предоставляет MySQL. (Но вы не можете объединять такие строки, вы должны использовать:
CONCAT(@WeekRangeStart, '-', @WeekRangeEnd)
)