在PostgreSQL,数据类型timestamp和timestamp with timezone都使用8个字节.
我的问题是:
timestamp with timezone
类型中,以及在读取类型时如何解析?我想改进这个慢查询,我想添加一个索引,但我不知道哪种索引类型更适合我的情况。
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)
注意:根据 Erwin 的建议,查询运行得更快一些,但我认为还不够快。
"Aggregate (cost=119667.76..119667.77 rows=1 width=0) (actual …Run Code Online (Sandbox Code Playgroud) 我正在从posgresql数据库中选择一个timestamptz.我希望我的选择只返回日期,小时和分钟.没有秒.我可以在psql select中设置日期格式以适应这种情况吗?
我试图使用此代码在特定日期查找事件:
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.
谢谢!
我需要在我的应用程序中使用多个时区.
基本上我的系统生成数据,来自地球上任何地方的客户都可以访问它.
由于我的数据有一个相关的时间戳,我想到了以下处理时区的策略.
在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用户可以确认或纠正我的策略.
有趣的链接:
脚步:
在我的本地主机服务器上,我在位于太平洋时区的浏览器中选择时间 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 的整个开发环境不会与本地时区混淆。为简单起见,我需要 100% 确定每个时间(戳记)值都是 UTC。当我timestamp without time zone使用该CURRENT_TIMESTAMP函数插入带有(!)的一行时,我不得不意识到情况并非如此,即使我从未指定任何时区信息。
是否有任何分步手册可以帮助我摆脱时区?
我正在尝试查询我的rails数据库(Postgres)中的购买表,我想查询时间范围.
例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买.
created_at此表中有一列,但我没有看到如何在不搜索特定日期的情况下完成此操作.
我试过了:
Purchases.where("created_at BETWEEN ? and ?", Time.now - 1.hour, Time.now)
但这最终只会在那些时候搜索今天的日期.
我需要使用类似的查询
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,在必要的任何区域中显示)
我正在使用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)
这个日期将设置为当天结束.