我有一个表date和time字段.我很难理解我是如何处理这个问题的,部分是因为我不明白时间如何转换为数字.我使用以下命令创建了一个表:
CREATE TABLE tracking.time_record
(
date date,
"time" time without time zone,
id character(100)
)
Run Code Online (Sandbox Code Playgroud)
我的数据示例如下:
"2012-04-18" | "18:33:19.612" | "2342342384"
Run Code Online (Sandbox Code Playgroud)
例如,如何运行查询以便我可以检查在某一天id具有时间值的所有值> 10 pm?
我意识到,因为我的时间存储在一个字符类型变量中,所以这样的东西不起作用:
SELECT * FROM tracking.time_record
WHERE "time" > "04:33:38.884" AND date > "2012-04-18"
Run Code Online (Sandbox Code Playgroud)
(这是我对时间/日期跟踪的第一次探索 - 我应该选择不同的列名)
我正在使用Postgres 8.3(目前无法选择版本)。我的原始数据表如下:
ID start_time finish_time
01 2013-01-23 10:47:52-05 2013-02-25 11:18:36-05
Run Code Online (Sandbox Code Playgroud)
我可以在两个时间戳之间计数:
--relevant line in view creation query:
date_part('epoch',(finish_time - start_time)::interval)/3600 as hours
Run Code Online (Sandbox Code Playgroud)
我不想包括周末。另外,我只想计数09:00-17:30。
在一个理想的世界中,我每天也要减去一个小时的午餐时间,最终我还希望包括公司假期,但是我想首先解决这个工作时间部分。
有关如何处理此问题的任何建议?我对SQL很陌生。我也乐于使用SQLalchemy,但我也是那里的初学者,对直接SQL感到更自在。
在这个查询中:
Select * from table where future_date - CURRENT_DATE <= '10';
它返回 10 天或更短的间隔。
如何添加两个参数?例子:
Select * from table where future_date - CURRENT_DATE <= '10' AND >= '30';
Run Code Online (Sandbox Code Playgroud)
我已经尝试过:
Select * from table where future_date - CURRENT_DATE BETWEEN '10' AND '30'
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
我想将一列从timestamp(无时区)迁移到timestamptz类型。
我在 Postgres 9.3.9 上。
我需要知道此操作是否会导致表重写(锁定表),因为我的表很大并且数据库处于活动状态。
我在9.2 发行说明中发现了这一点:
增加 varchar 或 varbit 列的长度限制,或完全删除限制,不再需要重写表。同样,增加数值列的允许精度,或将列从受约束的数值更改为不受约束的数值,不再需要重写表。在涉及间隔、时间戳和时间戳记类型的类似情况下,也可以避免表重写。
这听起来很有希望,但实际上并没有详细说明“类似案例”可能是什么。
如果此操作时要锁住我会很感激了如何解决这个在实时数据库在不中断服务的建议表。
我们使用的是 Postgresql 9.4,在使用 date_trunc 时我注意到一个奇怪的行为。结果中的时区移动了 1 小时:
select date_trunc('year','2016-08-05 04:01:58.372486-05'::timestamp with time zone);
date_trunc
------------------------
2016-01-01 00:00:00-06
Run Code Online (Sandbox Code Playgroud)
截断到例如天时没有这种行为:
select date_trunc('day','2016-08-05 04:01:58.372486-05'::timestamp with time zone);
date_trunc
------------------------
2016-08-05 00:00:00-05
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?如果是这样,这背后的逻辑是什么?
我对重新讨论这个过度讨论的话题犹豫不决,但我创建了一组表来存储数据,其中许多表包括一个名为“createdate”的字段,指定为“没有时区的时间戳”。代码库提供给这些的日期/时间值始终采用 UTC。UI 将能够控制向用户呈现数据的方式,因此某些设置将指示在 UI 中转换为时区。
其中一些时间戳将用于报告,以便为最终用户显示信息。其他时候,这些值将用于确定针对数据运行的夜间作业。
这是一个典型的多租户云托管系统,其客户端跨不同时区。服务器应该永远不会被移动,但我想改变托管区是一个非常遥远的可能性。它是在.net平台上编写的。不使用 noda 时间,只使用内置的 DateTime 内容(目前)。
文档非常清楚时区时间戳如何存储信息:https : //www.postgresql.org/docs/current/datatype-datetime.html
这个答案对两种主要时间戳数据类型的差异也有很好的背景:https : //stackoverflow.com/a/14616640/1905693
这个答案也有一些很好的信息,但面向 Java: 使用 Java 在 PostgreSQL 中存储时间的最推荐方法是什么?
Josh Berkus 有一篇过时的文章很有帮助:https ://it.toolbox.com/blogs/josh-berkus/zone-of-misunderstanding-092811
似乎其中大多数都推荐带时区的时间戳,但就我而言,没有时区的时间戳是否合适?
如果我确实想依靠 pg 进行转换,那么 AT TIME ZONE 子句可以吗?
从整体系统架构来看,依靠 UI 来改变呈现方式是一种常见且合理的方法吗?(是的,这个对于 SO 的格式来说可能过于主观了)
我正在使用postgresql在数据库上存储一些日期.
在我的应用程序中,它是完全了解时区的基础,我正在进行一些基本的测试,在客户端,服务器和数据库之间.
我从浏览器的应用程序中发送日期,我在GWT中读取了postgresql上的日期.
我的测试:
客户端始终处于GMT时区,我每个案例的发送时间总是相同.
13/04/2012 00:00:00 GMT + 00
在posgres我正在改变每个测试的时区.在测试之间,我正在从表中删除所有日期.
要更改posgres上的时区,我在{PostgreSQL HOME}\9.1\data\postgresql.conf上设置timezene到我想要的时间.
测试:客户:13/04/2012 00:00:00 GMT + 00
第1次测试 - posgres EST - 12/04/2012 19:00:00-05根据postgresql文档 EST = GMT - 5
第2次测试 - posgres GMT + 5 - 12/04/2012 19:00:00-05
第3次测试 - posgres GMT - 5 - 13/04/2012 05:00:00 + 05
现在我的问题上升了:根据文档,EST = GMT - 5.那么为什么我会以相反的方式阅读呢?我在这里错过了什么吗?
编辑
我测试的技术方面:
在客户端我发送此信息:2012年4月13日00:00:00 GMT + 00.
在服务器上我使用JDBC在db上编写:
将java.utils.date转换为java.sql.timestamp
java.sql.Timestamp sqlTimeStamp = new java.sql.Timestamp(date.getTime());
(日期是来自客户端的java.utils.Date)
设置准备好的声明
PreparedStatement ps = con.prepareStatement("INSERT INTO teste.dates (dates_tz, dates_ntz) VALUES …
我在更新时间戳字段的 PostgreSQL 表上有一个触发器,但我想将其置于正确的时区。默认情况下,如何将我的列设置为始终位于“PST”中?这是我的触发器:
ALTER TABLE coastal ADD latest_report TIMESTAMP;
ALTER TABLE coastal ALTER COLUMN latest_report
SET DEFAULT CURRENT_TIMESTAMP;
UPDATE coastal SET latest_report=CURRENT_TIMESTAMP;
CREATE OR REPLACE FUNCTION coastal_latest_report()
RETURNS TRIGGER AS '
BEGIN
NEW.latest_report = NOW();
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER coastal_latest_report_modtime BEFORE UPDATE
ON coastal FOR EACH ROW EXECUTE PROCEDURE
coastal_latest_report();
Run Code Online (Sandbox Code Playgroud) 我试图了解Postgre中的时间戳和时区。我想我明白了,直到我写这篇文章为止。
专注于“在时区之间转换”部分。它有两个例子。
(将默认时区配置考虑为UTC。)
例子1
db=# SELECT timezone('US/Pacific', '2016-01-01 00:00'); outputs 2015-12-31 16:00:00
Run Code Online (Sandbox Code Playgroud)
根据本文和我的理解,由于该函数的'2016-01-01 00:00'一部分timezone只是一个字符串,因此将其静默转换为默认的UTC。因此,'2016-01-01 00:00' UTC然后将其转换US/Pacific为timezone函数所要求的,即2015-12-31 16:00:00。
例子2
db=# SELECT timezone('US/Pacific', '2016-01-01 00:00'::timestamp); outputs 2016-01-01 08:00:00+00
Run Code Online (Sandbox Code Playgroud)
不好意思,我不明白为什么,那里的解释也无济于事。好的,函数的'2016-01-01 00:00'::timestamp一部分timezone不再是字符串,而是实际的时间戳。在什么时区?如果是UTC,则输出必须与示例1相同。因此,它将自动转换为US/Pacific?。那么输出是UTC吗?但为什么?我要求的 不是US/Pacific我timezone的UTC。
请说明timezone何时获取时间戳并被要求转换时间戳时的行为。谢谢。
postgresql timezone timestamp timezone-offset timestamp-with-timezone
想要DateTime在Ecto模式和迁移中使用,而不是默认值NaiveDateTime,也要timestamptz在PostgreSQL中使用,而不是默认值timestamp(aka。timestamp without time zone)。
postgresql ×10
timestamp ×4
timezone ×4
datetime ×3
sql ×3
.net ×1
alter-table ×1
c# ×1
concurrency ×1
date-range ×1
ecto ×1
elixir ×1
jdbc ×1
sqlalchemy ×1
time ×1