我在postgresql数据库中有一个日期字段是“TIMESTAMP WITHOUT TIMEZONE”。
对于今天(2016年2月3日星期三)发生的事件,它存储为:2016-02-03 00:00:00
。我想把今天到未来两周的所有活动都退回去。
两周后我定了一个日期:
var twoWeeksFromNow = new Date(+new Date + 12096e5);
如果我这样创建今天的日期:
var today = new Date().setHours(0,0,0);
我得到一个时间戳超出范围的错误。
如果我把它设为
var today = new Date(new Date().setHours(0,0,0));
只是今天的事情不再发生了。
我的问题是:
"SELECT * FROM events WHERE event_date >= today AND event_date < twoWeeksFromNow"
如何使它与javascript日期对象或字符串化日期对象匹配今天的日期?我哪里做错了?
最佳答案
您必须知道“今天”是由您当前的时区设置定义的。如果您的所有操作都限制在同一时区内,则可以使用timestamp [without time zone]
。否则,请考虑timestamp with time zone
-并更仔细地定义“今天”。
接下来,您不应该调用timestamp
列event_date
,因为它不是日期。日期不包含时间组件。
将“从今天到未来两周”定义为14天(如果今天是星期五,则在星期四结束):
SELECT *
FROM events
WHERE event_date >= current_date -- work with time zone session
AND event_date < current_date + 14;
当前会话的时区设置定义了“今天”。
不要像另一个答案建议的那样将该列转换为最新的,否则表达式将不再是sargable,并且不能对
event_date::date
使用普通索引,这是在更大的表中提高性能的关键。您只需将整数添加到
(event_date)
(以添加天数)。对于时间戳,这是不可能的。假定进程中的时间date
,日期将隐式转换为时间戳。如果要确保“今天”不转移到其他时区:
SELECT *
FROM events, date_trunc('day', now() AT TIME ZONE 'Europe/Vienna') AS t
WHERE event_date >= t
AND event_date < t + interval '14 days';
这将保证返回与当前时区设置无关的正确结果。
将“欧洲/维也纳”替换为您的时区名称。使用时区名称(不是时区缩写或数字偏移量)来抵御DST(夏令时)的胡说八道。您可以在系统表
00:00
中找到它们。详细说明:
Ignoring timezones altogether in Rails and PostgreSQL
关于javascript - 没有时区的PostgreSQL字段时间戳-如何检查它是否等于今天,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35174802/