我在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日期对象或字符串化日期对象来匹配今天的日期?我哪里错了?
答案 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;。
不要将列投射到日期,就像另一个回答建议 或表达式不再是sargable而且你可以&#39;使用event_date::date
(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