我有一个bus_stops表,其中包含与地址表的一对一关联,并且地址具有时区属性。
现在在搜索停止时间时,比如说所有的公共汽车都在晚上7点出发,这需要搜索当地时间晚上7点出发的公共汽车站点,即
对于每个bus_stop,我需要将7PM转换为公交车站的本地时区,具体取决于地址记录的时区。
我如何使用SQL(对于postgres)来实现这一目标
答案 0 :(得分:1)
由于您的问题不是非常具体,我将以一个例子回答如何完成这样的事情。你必须根据你的目的调整这个例子;例如,我不希望您将出发时间存储为timestamp with time zone
。
CREATE TABLE address (
id integer PRIMARY KEY,
timezone text NOT NULL
);
INSERT INTO address VALUES
(1, 'America/Los_Angeles'),
(2, 'America/Chihuahua');
CREATE TABLE bus_stop (
id integer PRIMARY KEY,
depart TIMESTAMP WITH TIME ZONE NOT NULL,
address_id INTEGER NOT NULL
REFERENCES address(id)
);
INSERT INTO bus_stop VALUES
(1, '2017-06-27 19:00:00 America/Los_Angeles', 1),
(2, '2017-06-27 18:00:00 America/Los_Angeles', 1),
(3, '2017-06-27 18:00:00 America/Los_Angeles', 2);
现在我们想知道哪个公共汽车站将在当地时间19:00离开公共汽车:
SELECT b.id
FROM bus_stop b
JOIN address a
ON b.address_id = a.id
WHERE (b.depart AT TIME ZONE a.timezone) = TIMESTAMP '2017-06-27 19:00:00';
┌────┐
│ id │
├────┤
│ 1 │
│ 3 │
└────┘
(2 rows)
答案 1 :(得分:0)
使用AT TIME ZONE
从时区转换为另一个时区:
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'BRT';
更多信息here。