根据关联的记录区域字段转换输入时区

时间:2017-06-26 23:38:35

标签: sql ruby-on-rails postgresql

我有一个bus_stops表,其中包含与地址表的一对一关联,并且地址具有时区属性。

现在在搜索停止时间时,比如说所有的公共汽车都在晚上7点出发,这需要搜索当地时间晚上7点出发的公共汽车站点,即

对于每个bus_stop,我需要将7PM转换为公交车站的本地时区,具体取决于地址记录的时区。

我如何使用SQL(对于postgres)来实现这一目标

2 个答案:

答案 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