>我在postgresql数据库中有一个日期字段,作为"没有时区的时间戳"。
它被存储为:今天发生的事件的2016-02-03 00:00:00
(2016年2月3日星期三(。我想返回从今天到未来两周的所有事件。
我设定了两周后的日期:
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;
当前会话的时区设置定义了"今天"。
不要像另一个答案建议的那样强制转换
的列,或者表达式不再可优化,并且您不能对event_date::date
(event_date)
使用普通索引 - 这是在较大表中提高性能的关键。您可以只向
date
添加整数(以添加天数(。时间戳不可能做到这一点。日期将隐式转换为时间戳,假定过程中的时间00:00
。
如果要确保"今天"不会转移到其他时区:
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(夏令时(废话。您可以在系统表中找到它们pg_timezone_names
。
详细说明:
- 在 Rails 和 PostgreSQL 中完全忽略时区
这可能是您问题的解决方案。
SELECT * FROM events WHERE event_date ::date >= CURRENT_DATE AND event_date ::date < CURRENT_DATE +14