我在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-并更仔细地定义“今天”。
接下来,您不应该调用timestampevent_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/

10-12 13:31