假设我想在 24 小时内每 5 分钟生成一个系列。我如何在 PostgreSQL 中做到这一点?
PostgreSQL 可以generate_series()
来自 a timestamp
,但不能来自time
.
选择任意时间戳更好,还是有另一种生成系列的方法?
我有一个看起来像这样的表(在 PostgreSQL 9.4 中):
CREATE TABLE dates_ranges (kind int, start_date date, end_date date);
INSERT INTO dates_ranges VALUES
(1, '2018-01-01', '2018-01-31'),
(1, '2018-01-01', '2018-01-05'),
(1, '2018-01-03', '2018-01-06'),
(2, '2018-01-01', '2018-01-01'),
(2, '2018-01-01', '2018-01-02'),
(3, '2018-01-02', '2018-01-08'),
(3, '2018-01-05', '2018-01-10');
Run Code Online (Sandbox Code Playgroud)
现在我想计算给定日期和每种类型,计算dates_ranges
每个日期有多少行。零可以省略。
想要的结果:
+-------+------------+----+
| kind | as_of_date | n |
+-------+------------+----+
| 1 | 2018-01-01 | 2 |
| 1 | 2018-01-02 | 2 |
| 1 | 2018-01-03 | 3 |
| 2 | 2018-01-01 | 2 |
| …
Run Code Online (Sandbox Code Playgroud) 我有一个这样的表:
CREATE TABLE my_data (label text, value integer, date date);
INSERT INTO my_data (label, value, date) VALUES
('AAA', 10, '2014-06-01'),
('AAA', 30, '2014-09-01'),
('AAA', 40, '2014-10-01'),
('AAA', 50, '2015-02-01'),
('BBB', 20, '2014-11-01'),
('BBB', 10, '2015-02-01'),
('BBB', 70, '2015-04-01');
Run Code Online (Sandbox Code Playgroud)
我需要以这种方式填写缺失的日期(想象一个时间序列):
label | value | date
------+-------+------------
AAA | 10 | 2014-06-01
AAA | 10 | 2014-07-01
AAA | 10 | 2014-08-01
AAA | 30 | 2014-09-01
AAA | 40 | 2014-10-01
AAA | 40 | 2014-11-01
AAA | 40 | 2014-12-01 …
Run Code Online (Sandbox Code Playgroud) 我正在将 Web 应用程序从 SqlServer 迁移到 PostgreSQL,并且我正在尝试找出要替换的类型datetime2
。
一般的建议似乎是总是使用timestamptz
,以及从不使用timestamp
。给出的原因往往是时间戳和timestamptz
存储相同(因此没有性能损失)并timestamptz
自动转换为连接的时区。在 Rails 和 PostgreSQL 中完全忽略时区 | 堆栈溢出
不幸的是,我的旧版 .NET 代码库与日期时间非常不一致,我们通常以 UTC 进行渲染,而不管用户时区如何。最近的代码一直在使用 NodaTime 及其Instant
类,但我们很少需要处理时间并且仅显示日期已经“足够接近”。然而,我对正确使用 NodaTime 的理解是尽可能晚地将 转换Instant
为,而不是在数据库中。LocalDateTime
除此之外,我不完全确定 Postgres 如何知道“当前用户”的正确时区。我知道您可以专门将时区设置为会话参数SET TIME ZONE 'UTC';
,您是否希望为每个连接执行此操作以适合“当前用户”?如果是这样,每当从连接池检索连接时都会重置它吗?我还看到 Npgsql 能够为连接字符串设置时区,如果是针对每个用户,这可能是不合适的?
所有这些使我认为最好的选择是用于timestamp
所有日期时间,并使用应用程序逻辑转换为本地日期时间。我想另一个选择是用于timestamptz
所有日期时间,强制连接在连接字符串中使用 UTC,并使用应用程序逻辑转换为本地日期时间。但是我担心 Postgres 会在 UTC 和 UTC 之间进行无操作转换时执行额外的工作。
TLDR:timestamptz
如果应用程序始终插入/读取 UTC 并转换为本地日期时间本身,这仍然是首选吗?