相关疑难解决方法(0)

在Rails和PostgreSQL中完全忽略时区

我正在处理Rails和Postgres中的日期和时间并遇到这个问题:

数据库采用UTC格式.

用户在Rails应用程序中设置选择的时区,但仅在获取用户本地时间来比较时间时使用.

用户存储时间,例如2012年3月17日晚上7点.我不希望存储时区转换或时区.我只想保存日期和时间.这样,如果用户改变他们的时区,它仍将显示2012年3月17日,晚上7点.

我只使用用户指定的时区来获取用户本地时区当前时间之前或之后的记录.

我目前正在使用"没有时区的时间戳",但是当我检索记录时,rails(?)会将它们转换为应用程序中的时区,这是我不想要的.

Appointment.first.time
 => Fri, 02 Mar 2012 19:00:00 UTC +00:00 
Run Code Online (Sandbox Code Playgroud)

因为数据库中的记录似乎是以UTC形式出现的,我的黑客是用当前时间,用'Date.strptime(str,"%m /%d /%Y")删除时区,然后做我的查询:

.where("time >= ?", date_start)
Run Code Online (Sandbox Code Playgroud)

似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?

postgresql timezone datetime ruby-on-rails ruby-on-rails-3

156
推荐指数
1
解决办法
3万
查看次数

将不带时区的时间戳转换为带时区的时间戳

我有一个类型为 nullable 的列timestamp without time zone。它以以下格式存储在我的 Postgres 数据库中:2021-06-24 11:00:00. 我想将其转换为可为空的timestamp with time zone类型,以便将其显示为2021-06-24 11:00:00.000-00. 请注意,没有时区转换。

该解决方案还应该允许从 转换timestamp with time zonetimestamp without time zone。我做了一些研究,但没有找到任何东西。

sql postgresql timestamp timestamp-with-timezone

7
推荐指数
2
解决办法
2万
查看次数

将索引添加到带时区的时间戳

我想改进这个慢查询,我想添加一个索引,但我不知道哪种索引类型更适合我的情况。

SELECT COUNT(*) ct FROM events
WHERE dtt AT TIME ZONE 'America/Santiago'
   >= date(now() AT TIME ZONE 'America/Santiago') + interval '1s'  
Run Code Online (Sandbox Code Playgroud)

查询计划:

"Aggregate  (cost=128032.03..128032.04 rows=1 width=0) (actual time=3929.083..3929.083 rows=1 loops=1)"
"  ->  Seq Scan on events  (cost=0.00..125937.68 rows=837742 width=0) (actual time=113.080..3926.972 rows=25849 loops=1)"
"        Filter: (timezone('America/Santiago'::text, dtt) >= (date(timezone('America/Santiago'::text, now())) + '00:00:01'::interval))"
"        Rows Removed by Filter: 2487386"
"Planning time: 0.179 ms"
"Execution time: 3929.136 ms"
Run Code Online (Sandbox Code Playgroud)
  • 查询获取当天事件的计数。
  • dtt 是带有时区列的时间戳。
  • 我正在使用 Postgresql 9.4。

注意:根据 Erwin 的建议,查询运行得更快一些,但我认为还不够快。

"Aggregate  (cost=119667.76..119667.77 rows=1 width=0) (actual …
Run Code Online (Sandbox Code Playgroud)

sql postgresql indexing timezone count

6
推荐指数
1
解决办法
5476
查看次数

PostgreSQL、pgAdmin、Java:如何将它们全部设为 UTC?

如何确保围绕 PostgreSQL 的整个开发环境不会与本地时区混淆。为简单起见,我需要 100% 确定每个时间(戳记)值都是 UTC。当我timestamp without time zone使用该CURRENT_TIMESTAMP函数插入带有(!)的一行时,我不得不意识到情况并非如此,即使我从未指定任何时区信息。

是否有任何分步手册可以帮助我摆脱时区?

java postgresql timezone timestamp utc

5
推荐指数
1
解决办法
2107
查看次数

Postgres数据库中奇特的时区处理

我的环境

我在法国巴黎(UTC+1CET).
这是12am(00:00),我们是在2016年11月25日.
我的Postgres数据库托管在该地区的Amazon Web Services(AWS RDS)上eu-west-1.

问题

查询具有特定时区设置的current_date(或current_time)似乎会产生与我的信念不一致的结果.

特别是,current_date在使用CET时区或时区时,查询结果会产生不同的结果UTC+1.

SET TIME ZONE 'UTC+01';
select current_date, current_time;
Run Code Online (Sandbox Code Playgroud)
+------------+--------------------+
| date       | timetz             |
+------------+--------------------+
| 2016-11-24 | 22:00:01.581552-01 |
+---------------------------------+

不,那是昨天 - 两个小时前.


SET TIME ZONE 'CET';
select current_date, current_time;
Run Code Online (Sandbox Code Playgroud)

要么

SET TIME ZONE 'Europe/Paris';
select current_date, current_time;
Run Code Online (Sandbox Code Playgroud)
+------------+--------------------+
| date …

postgresql timezone amazon-web-services

5
推荐指数
1
解决办法
996
查看次数

将 UTC 时间戳转换为 timestamptz

如何将timestampUTC 格式转换为timestamptz

如果我的本地时区是 GMT-1 并且我运行:

select '2017-01-01 00:00:00'::timestamptz

我得到:

2017-01-01 00:00:00-01

但我想要:

2017-01-01 01:00:00-01

postgresql timezone timestamp

5
推荐指数
1
解决办法
1万
查看次数

原始 UTC 值的 Postgres 时间戳和时区

我对重新讨论这个过度讨论的话题犹豫不决,但我创建了一组表来存储数据,其中许多表包括一个名为“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 的格式来说可能过于主观了)

.net c# postgresql datetime timestamp

3
推荐指数
2
解决办法
1868
查看次数

获取给定时间戳和 TZ 名称的 TZ 缩写

转换类型列是否可以获得正确的 TZ 缩写timestamptz

我是什么之后,SOF例子,是为了显示“2016年6月16日16:00-04:00”,在“美国/太平洋”时区目标TZ缩写。我可以很容易地得到这个:

06/16/2016 01:00 pm
Run Code Online (Sandbox Code Playgroud)

但我无法获得以下信息:

06/16/2016 01:00 pm PDT
Run Code Online (Sandbox Code Playgroud)

一旦转换,timestamptz就变成timestamp without timezoneto_char说明符 'TZ' 变得毫无意义......

这是我尝试过的示例:

SELECT
    scheduled_dt                                                                           AS scheduled_dt
  , to_char(scheduled_dt, 'TZ')                                                            AS scheduled_dt_orig_tz  
  -- correct value, but missing TZ  
  , timezone('US/Pacific', scheduled_dt)                                                   AS schedules_dt_converted_tz
  , to_char(timezone('US/Pacific', scheduled_dt), 'MM/DD/YYYY HH:MI pm')                   AS scheduled_dt_converted_tz_localized
   -- after conversion TZ is lost
  , to_char(timezone('US/Pacific', scheduled_dt), 'MM/DD/YYYY HH:MI pm TZ')                AS scheduled_dt_converted_tz_localized_missing_tz
  -- with cast, wrong TZ is displayed …
Run Code Online (Sandbox Code Playgroud)

sql postgresql timezone datetime

2
推荐指数
1
解决办法
491
查看次数

通过时区获得时间间隔的差异

我在PostgreSQL中有一个表:

CREATE TABLE tableA
(
    time_A time with timezone
);
Run Code Online (Sandbox Code Playgroud)

如何获得now()和之间的分钟差异time_A

sql postgresql datetime

0
推荐指数
1
解决办法
7636
查看次数