相关疑难解决方法(0)

数据类型"带时区的时间戳"中的时区存储

在PostgreSQL,数据类型timestamptimestamp with timezone都使用8个字节.

我的问题是:

  1. 什么格式用于在时间戳中存储日期和时间?
  2. 时区信息如何存储在timestamp with timezone 类型中,以及在读取类型时如何解析?

sql postgresql timezone datetime types

6
推荐指数
2
解决办法
4418
查看次数

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

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

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选择带时区的时间戳,但忽略秒

我正在从posgresql数据库中选择一个timestamptz.我希望我的选择只返回日期,小时和分钟.没有秒.我可以在psql select中设置日期格式以适应这种情况吗?

postgresql timestamp-with-timezone

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

Rails 3 DateTime和time begin_of_day end_of_day格式不正确

我试图使用此代码在特定日期查找事件:

Event.where('starttime BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day)
Run Code Online (Sandbox Code Playgroud)

在rails控制台中,如果我运行,DateTime.now.beginning_of_day我会得到我所期望的:

2012年4月9日星期一00:00:00 -0700

我可以看到问题出在哪里,但在rails控制台中查看SQL.不知何故,当日期进入SQL查询时,它会自动格式化为错误的日期和时间.

SELECT "events".* FROM "events" WHERE (starttime BETWEEN '2012-04-09 07:00:00' AND '2012-04-10 06:59:59')
Run Code Online (Sandbox Code Playgroud)

这给了我从今天到明天不同的结果,正如上面的sql所说的那样.我可以看到,当DateTime.now.beginning_of_day也使DateTime.now.end_of_day进入sql查询时,它们的格式不正确.我需要以某种方式格式化吗?知道为什么会到今天的7点和明天的7点?

我不知道它是否有所作为,但我正在使用PostgreSQL.

谢谢!

postgresql ruby-on-rails ruby-on-rails-3

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

关于在postgresql中使用时区的策略

我需要在我的应用程序中使用多个时区.

基本上我的系统生成数据,来自地球上任何地方的客户都可以访问它.

由于我的数据有一个相关的时间戳,我想到了以下处理时区的策略.

在Postgres:

  • 使用::timestamptz我的时间戳的类型创建我的表.没有时区的时间戳不允许混合::timestamp,::timestamptz在我的情况下看起来像一颗定时炸弹.

  • 将我的PG服务器系统的时区设置为UTC.

  • 设置timezone='UTC'postgresql.conf(可能并不需要,如果系统的TZ是UTC,但我是一个有点偏执,它花了我什么).

  • 创建表时添加以下检查:

    CONSTRAINT timestamp_must_be_utc CHECK(date_part('timezone':: text,"my_timestamp_field")= 0 :: double precision)

  • 以UTC格式存储我的所有时间戳

在客户端(python + pytz)

  • 将客户的时区存储在他的个人资料中,例如 'America/Los Angeles'

  • 在查询数据时将时区信息发送到postgres,这样我就能获得类似的东西SELECT xxxx FROM yyyy WHERE my_ts >= '2012-11-27 19:13:00+01'::timestamptz,让Postgres转换为UTC.或者我可以使用pytz进行转换,但似乎Postgres会做得很好.

  • 根据客户的时区转换时间戳,以便我可以正确显示数据+时间戳.

总而言之,我计划在任何地方使用UTC来存储和查询数据,并在显示数据时只使用时区转换.

我对Postgres及其处理时区的方式没有多少经验.我知道处理不同时区的日期和时间是多么困难(一旦你必须使用航班时刻表,你就会学到使用UTC是唯一可行的日期和时间微积分的方法)这就是我要问的原因这个问题让我更有经验的postgres用户可以确认或纠正我的策略.

有趣的链接:

postgresql timezone datetime timestamp

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

模型的日期时间字段与本地主机在 heroku 上的存储方式不同

脚步:

在我的本地主机服务器上,我在位于太平洋时区的浏览器中选择时间 2013 年 1 月 18 日上午 10 点 - 上午 11 点。然后我在 heroku 上的生产服务器上选择完全相同的时间。

如您所见,保存到数据库的内容的输出是不同的。我希望生产作为本地主机运行,并在将时间存储为 UTC 时考虑时区。这是什么原因造成的?heroku 服务器在 EST 中,但这并没有考虑到这种行为。

控制器:

  def create
    puts params[:event][:starts_at]
    @event = Event.create!(params[:event])
    puts @event.starts_at
  end
Run Code Online (Sandbox Code Playgroud)

输出本地主机:

2013 年 1 月 18 日星期五 10:00:00 GMT-0800(太平洋标准时间)

2013-01-18 18:00:00 UTC

输出 Heroku(生产):

2013 年 1 月 18 日星期五 10:00:00 GMT-0800(太平洋标准时间)

2013-01-18 10:00:00 UTC

架构:

 t.datetime "starts_at"
Run Code Online (Sandbox Code Playgroud)

环境:

Ruby on Rails 3.2.11

红宝石 1.9.3

Postgres

postgresql timezone ruby-on-rails heroku ruby-on-rails-3.2

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

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

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

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

java postgresql timezone timestamp utc

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

查询忽略时间戳日期的时间范围

我正在尝试查询我的rails数据库(Postgres)中的购买表,我想查询时间范围.

例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买.

created_at此表中有一列,但我没有看到如何在不搜索特定日期的情况下完成此操作.

我试过了:

Purchases.where("created_at BETWEEN ? and ?", Time.now - 1.hour, Time.now)

但这最终只会在那些时候搜索今天的日期.

ruby sql postgresql ruby-on-rails rails-activerecord

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

如何将Rails时区名称映射到PostgreSQL?

我需要使用类似的查询
SELECT * FROM items WHERE to_char(created_at AT TIME ZONE 'RAILS_GIVEN_ZONE', 'DD/MM/YYYY') ILIKE '%5/02%'

RAILS_GIVEN_ZONE值应始终使用Rails 4应用程序中的时区(可由用户更改),而不是PG的timezone选项。

但是问题在于,Rails和PG的时区并不完全一对一。

使用偏移量(如+10:00from中的值Time.zone.now.formatted_offset)还不够好,因为在这种情况下,PG将无法正确处理夏令时。

因此,问题是将Rails当前时区(Time.zone)自动映射到PostgreSQL 命名时区的最佳方法是什么?

注意:create_at列是timestamptz(存储为UTC,在必要的任何区域中显示)

ruby postgresql timezone ruby-on-rails

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

如何结束一天?

我正在使用PostgreSQL 8.4.我有一个表的列,my_tbl其中包含日期(timestamp without timezone).例如:

       date
-------------------
2014-05-27 12:03:20
2014-10-30 01:20:03
2013-10-19 16:34:34
2013-07-10 15:24:26
2013-06-24 18:15:06
2012-07-14 07:09:14
2012-05-13 04:46:18
2013-01-04 21:31:10
2013-03-26 10:17:02
Run Code Online (Sandbox Code Playgroud)

如何编写以下格式返回所有日期的SQL查询:

xxxx-xx-xx 23:59:59
Run Code Online (Sandbox Code Playgroud)

这个日期将设置为当天结束.

sql postgresql date-arithmetic

5
推荐指数
2
解决办法
6693
查看次数