我正在处理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)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我想在接下来的14天里选择一个周年纪念日.如何根据不包括年份的日期进行选择?我尝试过类似下面的内容.
SELECT * FROM events
WHERE EXTRACT(month FROM "date") = 3
AND EXTRACT(day FROM "date") < EXTRACT(day FROM "date") + 14
Run Code Online (Sandbox Code Playgroud)
这个问题是几个月的换行.
我宁愿做这样的事情,但我不知道如何忽视这一年.
SELECT * FROM events
WHERE (date > '2013-03-01' AND date < '2013-04-01')
Run Code Online (Sandbox Code Playgroud)
我怎样才能在Postgres中完成这种日期数学运算?
我有一个名为场PostgreSQL的表data是jsonb有大量的对象,我想打一个索引,以加快查询.我使用几行来测试数据(只有15行),但我不希望将来出现查询问题.我从Twitter API获取数据,因此在一周内我获得了大约10GB的数据.
如果我做正常索引
CREATE INDEX ON tweet((data->>'created_at'));
我得到一个文本索引,如果我做:
Create index on tweet((CAST(data->>'created_at' AS timestamp)));
我明白了
ERROR: functions in index expression must be marked IMMUTABLE
我试图让它"无意识"设置时区
date_trunc('seconds', CAST(data->>'created_at' AS timestamp) at time zone 'GMT')
但我仍然得到"不可变"的错误.那么,我如何从JSON中完成时间戳索引?我知道我可以用日期创建一个简单的专栏,因为它可能在时间上保持不变,但我想学习如何做到这一点.