- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个Postgres时钟闹钟表(不是真的,但这是类似的,而且更容易解释)。警报由用户设置,分辨率为 1 小时,用户可以来自许多不同的时区。警报每天都在重复。我想可靠地获取应该在一天中的特定时间响起的警报,并且我遇到夏令时问题。如何以最佳方式做到这一点?
Alfred and Lotta both live in Stockholm (+1 hour from UTC, but +2hwhen it's DST).
Sharon lives in Singapore (+8 hours from UTC, noDST)During winter, Alfred sets an alarm for 4 AM. The alarm should go offat 4 AM local time, all year.
During summer, Lotta sets an alarmfor 5 AM. Again, it should go off at 5 AM all year round.
Meanwhile, Sharon has set an alarm for 11 AM.All of these can be stored in the database as 03:00 UTC.
If I query the database in the winter for alarms that should go off at03:00 UTC, I want Alfred's and Sharon's alarms. Singapore is now +7hfrom Sweden, so 11 AM in Singapore is 4 AM in Sweden. Lotta's alarmshould not go off for another hour.
Conversely, if I query the database in the summer for alarms thatshould go off at 03:00 UTC, I want Lotta's and Sharon's alarms.Singapore is +6h from Sweden now, so 11 AM in Singapore is 5 AM inSweden now. Sven's alarm went off an hour ago.
我如何存储它并查询数据库?
如有必要,我可以更改数据库架构。目前,我们根本不针对 DST 进行调整,实际上只有一个“小时”整数字段(这看起来很愚蠢,时间字段会更好)。
看来我需要同时存储 UTC 时间和时区信息,但我不知道如何在 Postgres 中最好地实现这一点。我发现 Postgres 有某种时区概念,但据我所知没有时区字段类型。此外,我想我需要在 SQL 中进行一些计算,以确定如何根据时区数据和创建日期在选择中偏移 UTC 时间。我对 SQL 不是很好……
我确实想在 Postgres 中解决这个问题,因为可能会有很多“警报”,而且我想避免将所有警报都提取到 Ruby 中并在那里进行过滤所带来的性能问题。 (是的,这是一个 Rails 应用程序。)
最佳答案
使用timestamp with time zone
(timestamptz
) 进行计算。
闹钟时间可以是time [without time zone]
。
但是您必须为每一行显式保存时区。
永远不要使用time with time zone
(timetz
) 它是一个逻辑错误的类型,PostgreSQL 不鼓励使用它。 The manual:
The type
time with time zone
is defined by the SQL standard, but thedefinition exhibits properties which lead to questionable usefulness.In most cases, a combination ofdate
,time
,timestamp without timezone
, andtimestamp with time zone
should provide a completerange of date/time functionality required by any application.
演示设置:
CREATE TABLE alarm(name text, t time, tz text);
INSERT INTO alarm VALUES
('Alfred', '04:00', 'Europe/Stockholm') -- Alfred sets an alarm for 4 AM.
, ('Lotta', '05:00', 'Europe/Stockholm') -- Lotta sets an alarm for 5 AM.
, ('Sharon', '11:00', 'Asia/Singapore'); -- Sharon has set an alarm for 11 AM.
它必须是时区名称(不是缩写)以说明 DST。相关:
获取“今天”的匹配闹钟:
SELECT *
FROM alarm
WHERE ((<b>'2012-07-01'::date + t</b>) AT TIME ZONE <b>tz</b> AT TIME ZONE <b>'UTC'</b>)::time
= '03:00'::time
('2012-7-1'::date + t)
... 组装 timestamp [without time zone]
也可以只是 now()::date + t
表示“今天”。AT WITH TIME ZONE tz
...在保存的时区放置时间戳,结果为 timestamptz
。AT WITH TIME ZONE 'UTC'
... 根据 UTC timestamp
::time
...提取时间分量的最简单方法。这里可以查询time zone names :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10;
关于sql - 选择预定项目时在 Postgres 中考虑 DST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239534/
我想知道这里是否有人有安装 Postgres-XL 的经验,新的开源多线程版本的 PostgreSQL。我计划将一组 1-2 TB 的数据库从常规 Postgres 9.3 迁移到 XL,并且想知道这
我想创建一个 postgres 备份脚本,但我不想使用 postgres 用户,因为我所在的 unix 系统几乎没有限制。我想要做的是在 crontab 上以 unix 系统(网络)的普通用户身份运行
我正在尝试编写一个 node-postgres 查询,它采用一个整数作为参数在间隔中使用: const query = { text: `SELECT foo
如何在不使用 gui 的情况下停止特定的 Postgres.app 集群。 我想使用 bash/Terminal.app 而不是 gui 我还应该指出,Postgres 应用程序有一个这样的菜单 如果
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我正在使用 docker 运行 Postgres 图像。它曾经在 Windows10 和 Ubuntu 18.04 上运行没有任何问题。 在 Ubuntu 系统上重新克隆项目后,它在运行 docker
我正在使用 python(比如表 A)将批处理 csv 文件加载到 postgres。我正在使用 pandas 将数据上传到更快的 block 中。 for chunk in pd.read_csv(
所以是的,标题说明了一切,我需要以某种方式将 DB 从源服务器获取到新服务器,但更重要的是旧服务器正在崩溃 :P 有什么方法可以将它全部移动到新服务器并导入它? 旧服务器只是拒绝再运行 Postgre
这主要是出于好奇而提出的问题。我正在浏览 Postgres systemd 单元文件,以了解 systemd 可以做什么。 Postgres 有两个 systemd 单元文件。一个用于代替 syste
从我在 pg_hba.conf 中读到的内容,我推断,为了确保提示我输入 postgres 用户的密码,我应该从当前的“对等”编辑 pg_hba.conf 的前两个条目的方法'到'密码'或'md5',
我已连接到架构 apm。 尝试执行函数并出现以下错误: ERROR: user mapping not found for "postgres" 数据库连接信息说: apm on postgres@
我在 ubuntu 12.04 服务器上,我正在尝试安装 postgresql。截至目前,我已成功安装它但无法配置它。我需要创建一个角色才能继续前进,我在终端中运行了这个命令: root@hostna
我无法以“postgres”用户身份登录到“postgres”数据库。操作系统:REHL 服务器版本 6.3PostgreSQL 版本:8.4有一个数据库“jiradb”用作 JIRA 6.0.8 的
我正在尝试将现有数据库导入 postgres docker 容器。 这就是我的处理方式: docker run --name pg-docker -e POSTGRES_PASSWORD=*****
我们的 Web 应用程序在 postgres 9.3 和 Grails 2.5.3 上运行。当我们重新启动 postgres (/etc/init.d/postgresql restart) 并访问网
我想构建 postgres docker 容器来测试一些问题。我有: postgres 文件的归档文件夹(/var/lib/postgres/data/) 将文件夹放入 docker postgres
我有一个名为“stuff”的表,其中有一个名为“tags”的 json 列,用于存储标签列表,还有一个名为“id”的列,它是表中每一行的主键。我正在使用 postgres 数据库。例如,一行看起来像这
我对 sqlalchemy-psql 中的锁定机制是如何工作的感到非常困惑。我正在运行一个带有 sqlalchemy 和 postgres 的 python-flask 应用程序。由于我有多个线程处理
我(必须)使用 Postgres 8.4 数据库。在这个数据库中,我创建了一个函数: CREATE OR REPLACE FUNCTION counter (mindate timestamptz,m
我已经使用 PostgreSQL 几天了,它运行良好。我一直在通过默认的 postgres 数据库用户和另一个具有权限的用户使用它。 今天中午(在一切正常之后)它停止工作,我再也无法回到数据库中。我会
我是一名优秀的程序员,十分优秀!