我正在处理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)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
它是否正确?
SELECT *
FROM contract
JOIN team USING (name_team)
JOIN player USING(name_player)
WHERE name_team = ?
AND DATE_PART('YEAR',date_join)>= ?
AND DATE_PART('YEAR',date_leave)<= ?
Run Code Online (Sandbox Code Playgroud)
我的桌子上contract有球员姓名,球队名称以及他加入和离开俱乐部的日期.
我想制作一个功能,列出特定年份团队中的所有玩家.
上面的查询似乎没有工作......
我需要帮助优化PostgreSQL查询,该查询使用BETWEEN带有timestamp字段的子句.
我有2张桌子:
ONE(int id_one(PK), datetime cut_time, int f1 . . .)
Run Code Online (Sandbox Code Playgroud)
包含大约3394行
TWO(int id_two(PK), int id_one(FK), int f2 . . .)
Run Code Online (Sandbox Code Playgroud)
包含大约4000000行
有两个的PK B树索引id_one和id_two,在FK id_one和cut_time.
我想执行如下查询:
select o.id_one, Date(o.cut_time), o.f1, t.f2
from one o
inner join two t ON (o.id_one = t.id_one)
where o.cut_time between '2013-01-01' and '2013-01-31';
Run Code Online (Sandbox Code Playgroud)
此查询在大约7秒内检索大约1.700.000行.
报告分析报告下面报告:
"Merge Join (cost=20000000003.53..20000197562.38 rows=1680916 width=24) (actual time=0.017..741.718 rows=1692345 loops=1)"
" Merge Cond: (c.coilid = hf.coilid)"
" -> Index Scan …Run Code Online (Sandbox Code Playgroud) 在这个查询中:
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)
但它不起作用。