没有时区的PostgreSQL字段时间戳 - 如何检查它是否等于今天



>我在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

相关内容

  • 没有找到相关文章

最新更新