将日期范围查询从 MySQL 翻译成 Postgres
Translating date range query from MySQL to Postgres
有一个mysql查询,我需要在postgresql查询中实现它。
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)
);
SET @WeekDate = CAST('2020/11/16' as DATETIME);
SET @WeekRangeStart = CAST('2020/11/16 00:00:00' as DATETIME);
SET @WeekRangeEnd = CAST('2020/11/22 00:00:00' as DATETIME);
select
object_id,ADDDATE(@WeekDate, -(DAYOFWEEK(@WeekDate)-1) +1) as Monday,
DATE_ADD(ADDDATE(@WeekDate, -(DAYOFWEEK(@WeekDate)-1) +9), INTERVAL -1 SECOND) as Sunday,
@range := CONCAT(@WeekRangeStart,' - ',@WeekRangeEnd) as 'Диапазон'
FROM objects;
此查询输出两个字段和@WeekRangeStart 和@WeekRangeEnd 中给出的范围。@Weekdate 找出一周中的哪一天,即星期一和星期日
INSERT INTO newdb.objects (object_id, city_id, price, area_total, status, class, action, date_create) VALUES (1, 1, 4600000, 72, 'active', 'Вторичная', 'Продажа', '2020-11-18 12:23:00');
INSERT INTO newdb.objects (object_id, city_id, price, area_total, status, class, action, date_create) VALUES (2, 2, 5400000, 84, 'active', 'Secondary', 'Sale', '2020-11-19 21:49:35');
结果是:
如何组织?在范围合并方面有帮助吗?
您可以使用 DATE_TRUNC 从对象中的日期获取星期一,然后星期日很容易计算
SELECT
object_id,
date_trunc('week', date_create)::timestamp AS "Monday",
(date_trunc('week', date_create)+ '6 days'::interval)::timestamp As "Sunday",
date_trunc('week', date_create)::timestamp
|| ' - '
|| (date_trunc('week', date_create)+ '6 days'::interval)::timestamp AS "range"
FROM objects
object_id | Monday | Sunday | range
--------: | :------------------ | :------------------ | :----------------------------------------
1 | 2020-11-16 00:00:00 | 2020-11-22 00:00:00 | 2020-11-16 00:00:00 - 2020-11-22 00:00:00
2 | 2020-11-16 00:00:00 | 2020-11-22 00:00:00 | 2020-11-16 00:00:00 - 2020-11-22 00:00:00
db<>fiddle here
有一个mysql查询,我需要在postgresql查询中实现它。
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)
);
SET @WeekDate = CAST('2020/11/16' as DATETIME);
SET @WeekRangeStart = CAST('2020/11/16 00:00:00' as DATETIME);
SET @WeekRangeEnd = CAST('2020/11/22 00:00:00' as DATETIME);
select
object_id,ADDDATE(@WeekDate, -(DAYOFWEEK(@WeekDate)-1) +1) as Monday,
DATE_ADD(ADDDATE(@WeekDate, -(DAYOFWEEK(@WeekDate)-1) +9), INTERVAL -1 SECOND) as Sunday,
@range := CONCAT(@WeekRangeStart,' - ',@WeekRangeEnd) as 'Диапазон'
FROM objects;
此查询输出两个字段和@WeekRangeStart 和@WeekRangeEnd 中给出的范围。@Weekdate 找出一周中的哪一天,即星期一和星期日
INSERT INTO newdb.objects (object_id, city_id, price, area_total, status, class, action, date_create) VALUES (1, 1, 4600000, 72, 'active', 'Вторичная', 'Продажа', '2020-11-18 12:23:00');
INSERT INTO newdb.objects (object_id, city_id, price, area_total, status, class, action, date_create) VALUES (2, 2, 5400000, 84, 'active', 'Secondary', 'Sale', '2020-11-19 21:49:35');
结果是:
如何组织?在范围合并方面有帮助吗?
您可以使用 DATE_TRUNC 从对象中的日期获取星期一,然后星期日很容易计算
SELECT object_id, date_trunc('week', date_create)::timestamp AS "Monday", (date_trunc('week', date_create)+ '6 days'::interval)::timestamp As "Sunday", date_trunc('week', date_create)::timestamp || ' - ' || (date_trunc('week', date_create)+ '6 days'::interval)::timestamp AS "range" FROM objects
object_id | Monday | Sunday | range --------: | :------------------ | :------------------ | :---------------------------------------- 1 | 2020-11-16 00:00:00 | 2020-11-22 00:00:00 | 2020-11-16 00:00:00 - 2020-11-22 00:00:00 2 | 2020-11-16 00:00:00 | 2020-11-22 00:00:00 | 2020-11-16 00:00:00 - 2020-11-22 00:00:00
db<>fiddle here