gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:25:09 25 4
gpt4 key购买 nike

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

它存储为:2016-02-03 00:00:00 今天发生的事件(2016 年 2 月 3 日星期三)。我想返回从今天到 future 两周的所有事件。

我设定了两周后的日期:

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 ,因为它不是日期。 日期不包含时间部分。

将“从今天到 future 两周”定义为正好 14 天的时间段(因此,如果今天是星期五,则在星期四结束):

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

  • 不要像另一个答案建议的那样将列转换到日期 event_date::date 或者表达式不是 sargable您不能再对 (event_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 中找到它们。

详细解释:

关于javascript - 没有时区的 PostgreSQL 字段时间戳 - 如何检查它是否等于今天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35174802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com