我在回答这个stackoverflow问题时发现了奇怪的结果:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
Run Code Online (Sandbox Code Playgroud)
和下一个查询
select id,
timestampwithtimezone,
timestampwithtimezone at time zone 'Europe/Berlin' as berlin,
timestampwithtimezone at time zone 'CET' as cet
from data ;
id | timestampwithtimezone | berlin | cet
-----+------------------------+---------------------+---------------------
205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 | 2012-10-28 00:30:00
204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
203 | 2012-10-28 02:30:00+02 …Run Code Online (Sandbox Code Playgroud) 假设我想在两个日期之间生成一系列日期。我看到该功能generate_series仅提供
Function Argument Type Return Type Description
generate_series(start, stop, step interval) timestamp or timestamp with time zone setof timestamp or setof timestamp with time zone (same as argument type) Generate a series of values, from start to stop with a step size of step
Run Code Online (Sandbox Code Playgroud)
那么我该怎么做呢?
只是一个关于在数据库中存储“时间”的快速问题。我正在记录用户运行的时间,格式为 00:00:00:00(小时、分钟、秒、毫秒)。
我最初打算将它存储为,TIME但后来我意识到 MySQL 不支持这种类型的毫秒。
我将存储从用户秒表中获取的实际时间,而不是他们运行和完成的时间(这将在插入之前计算)。
最好使用的字段类型是什么?我在想double或float,但我不确定这会起作用吗?
我正在为公元 1000 年之前扩展的记录创建一个数据库,但 MySQL 日期和日期时间字段仅支持从 1000 开始的日期。
有没有比使用 bigint 类型使用 Unix 时间戳计算 1/1/1970 之前/之后的秒数或切换到支持更大日期范围的数据库软件更方便的方法?
如何在 PostgreSQL 类型中以降低的精度存储日期和时间值,并使它们表现为日期和/或时间值?
ISO 8601 允许精度降低的日期值。'1964', '1964-05', '1964-05-02' 都是值的有效表示,精度越来越高。Python 'datetime' 类型也允许以这种方式降低精度的值。
在原生日期类型中,日期的每个元素都必须存在,否则该值将被拒绝。将低于所需精度级别的元素设置为“00”也会失败。
=> SELECT CAST('1964-05-02' AS DATE);
date
------------
1964-05-02
(1 row)
=> SELECT CAST('1964-05' AS DATE);
ERROR: invalid input syntax for type date: "1964-05"
LINE 1: SELECT CAST('1964-05' AS DATE);
^
=> SELECT CAST('1964' AS DATE);
ERROR: invalid input syntax for type date: "1964"
LINE 1: SELECT CAST('1964' AS DATE);
^
=> SELECT CAST('1964-00-00' AS DATE);
ERROR: date/time field value out of range: …Run Code Online (Sandbox Code Playgroud) 我有多个数据库服务器,我正在使用将过期列与now(). 问题是服务器的过期列之一是timestamp with time zone,其余的都是date。我无法更改此设置,因为我没有管理员访问权限,而且实际上我只是在查询视图。Postgres 对我来说相当陌生,所以我真的不明白日期和时间是如何相互配合的。
当我尝试timestamp with time zone通过将timestampa转换为 a 来查询服务器时date:
...
WHERE
(
status_code = '30000'
OR status_code = '30005'
)
AND CAST(expiration AS DATE) > now()
Run Code Online (Sandbox Code Playgroud)
它有效,但在expiration已经date失败的服务器上使用相同的查询:
[Err] 错误:类型日期的无效输入语法:“无结束日期”
任何帮助将不胜感激,我真的不想硬编码这个数据库服务器的异常。
时间戳数据类型是表示即时值还是年月日时分秒值?一个瞬间就是一个瞬间,就像你开始阅读这篇文章的那一刻一样,它可以用许多不同的 ymdhm-s+timezone 值来描述。没有时区,这是模棱两可的,同一时刻对我来说可能是 17:25,对其他人来说可能是 13:25。
这就是我认为我得到的。该current_timestamp函数返回当前时区的当前时间,所以这是一个明确的时刻,真正的now。在表中,它存储为 UTC,因此使用这个假定的时区,它也应该是明确的。
现在这是我不明白的:这是utc_timestamp函数的存在。我将 acurrent_timestamp和 an存储utc_timestamp在同一列中,它们是不同的。这个函数甚至不应该存在,我不明白为什么它代表不同的时刻。
我有数据拉取功能,可以在 5 秒内根据modified_timestamp列从 Postgres 表中抓取所有数据。它的工作方式如下:
SELECT * FROM my_table WHERE modified_timestamp > _some_persisted_timestamp其中modified_timestamp使用触发器更新(在任何行更新modified_timestamp变为 之后CURRENT_TIMESTAMP)。它工作正常,直到我注意到CURRENT_TIMESTAMPPostgres 实际上是事务开始时间戳并且一些更新丢失了。他们为什么会迷路?这很简单 - 在我执行查询时,SELECT * FROM my_table WHERE modified_timestamp > _some_persisted_timestamp一些更改已经发生,但modified_timestamp在更新_some_persisted_timestamp之前,因为事务仍在进行中。
当更新对其他事务可见(换句话说,事务提交时间戳)而不是 CURRENT_TIMESTAMP 或 clock_timestamp()时,可以通过在步骤 2 中 分配时间戳来轻松解决此问题。
我阅读了文档,但没有发现与事务提交时间戳相关的任何内容。你能不能给点建议?
顺便说一句,我知道逻辑解码,我知道这种机制在理论上更适合我的需求,但有一些实际问题不允许我使用它。
我在教科书(Avi Silberschatz、Henry F. Korth 和 S. Sudarshan $6e$ 的《数据库系统概念教科书》)中遇到了以下行。686:
Thomas 的写入规则允许不可冲突序列化但仍然正确的调度。那些允许的非冲突可序列化调度满足视图可序列化调度的定义(参见示例框)。
我从上面几行中了解到,遵循 Thomas 的写入规则的时间戳协议生成的每个时间表都是视图可序列化的。
现在让我们采用以下小时间表:$S:R_1(X)、W_2(X)、W_1(X)$。
这个时间表 $S$ 在时间戳协议下是允许的,该协议遵循 Thomas 的写入规则。
并且序列化顺序是 $R_1(X), W_1(X).$
但我无法证明它是视图可序列化的。
其实我认为它是非视图可序列化的,因为,
考虑串行顺序为 $T_1, T_2$
现在 $X$ 的最终值由 $T_2$ 写入。所以不等价。
下一个替代序列是 $T_2, T_1$
在这里,$R_1(X)$ 将读取由 $T_1$ 写入的 $X$ 的值,而不是在两个事务开始之前存在的原始值。所以这也不是视图等价的。
这里出了什么问题?请帮我解决这个问题。
我正在使用此语句以升序获取按时间戳排序的所有行
DELETE FROM @tableName
WHERE id = ANY (
SELECT id
FROM @tableName
WHERE source = :p1 AND target = :p2 @readCondition
ORDER BY createddate
LIMIT @limit
FOR UPDATE SKIP LOCKED
)
RETURNING *;
Run Code Online (Sandbox Code Playgroud)
我得到了这些结果:
"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.230886"
"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.279604"
"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.276191"
"MessageType":"AssignmentChange.v1","CreatedDate":"2019-12-05T10:55:22.202338"
Run Code Online (Sandbox Code Playgroud)
如您所见,它们没有按 排序createdate。有没有办法对子RETURNING句中的行进行排序?
timestamp ×10
postgresql ×6
mysql ×3
timezone ×3
datatypes ×2
date-format ×2
concurrency ×1
date ×1
datetime ×1
protocol ×1
sql-standard ×1