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

时间:2016-02-03 10:42:26

标签: javascript postgresql date datetime

我在postgresql数据库中有一个日期字段为" TIMESTAMP WITHOUT TIMEZONE"。

它存储为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日期对象或字符串化日期对象来匹配今天的日期?我哪里错了?

2 个答案:

答案 0 :(得分:1)

你必须意识到&#34;今天&#34;由您当前的时区设置定义。如果您的所有操作都限制在同一时区,则可以使用timestamp [without time zone]。否则,请考虑timestamp with time zone - 并定义&#34;今天&#34;更密切。

接下来,您不应该拨打timestamp event_date ,因为它不是日期。 日期不包含时间组件。

定义&#34;从今天起到未来两周&#34;准时为14天(如果今天是星期五,则在星期四结束):

SELECT *
FROM   events
WHERE  event_date >= current_date  -- work with time zone session
AND    event_date <  current_date + 14;
  • 您当前会话的时区设置定义了&#34;今天&#34;。

  • 不要将列投射到日期,就像另一个回答建议 event_date::date 或表达式不再是sargable而且你可以&#39;使用(event_date)上的普通索引 - 这是在更大的表格中表现的关键。

  • 您只需将整数添加到date(以添加天数)。时间戳无法实现同样的目的。假设过程中的时间00:00,日期将隐式转换为时间戳。

如果你想确保&#34;今天&#34;没有转移到其他时区:

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';

保证返回与当前时区设置无关的正确结果。

取代欧洲/维也纳&#39;与您的时区名称。使用时区名称(不是时区缩写或数字偏移)来防御DST(夏令时)废话。您可以在系统表pg_timezone_names中找到它们。

详细说明:

答案 1 :(得分:0)

这可能是您问题的解决方案。

    SELECT * FROM events WHERE event_date ::date >= CURRENT_DATE  AND event_date ::date < CURRENT_DATE +14