【问题标题】:PostgreSQL extract function in respect to timezones关于时区的 PostgreSQL 提取函数
【发布时间】:2019-02-07 04:16:51
【问题描述】:

我使用 PostgreSQL 的extract 函数来提取月份、季度、年份,如下所示:

select extract (month from adate) from atable

adatetimestamp with time zone

我遇到的问题是我发现这个函数与时区完全矛盾,我正在处理一个数据库,其中的数据因时区而异。所以在某些情况下,我需要关于太平洋时区的结果,在其他情况下,我需要关于 EST 或 CST 等的结果。

有没有办法获取特定时区的日期的月/季度/年?

【问题讨论】:

    标签: postgresql timezone extract sql-timestamp


    【解决方案1】:

    基本上你所做的是使用AT TIME ZONE 运算符将TIMESTAMP WITH TIMEZONE 转换为TIMESTAMP WITHOUT TIMEZONE,然后对其应用 date_part(AKA 提取)操作

    如果你想要一个特定的时区:

      select extract(month from adate AT TIME ZONE 'CST' ) from atable;
    

    如果您想要一个特定的位置:这将遵循过去日期的历史夏令时规则(和其他法定时区更改),并假定未来日期的当前规则。

      select extract(month from adate AT TIME ZONE 'America/Detroit' ) from atable;
    

    也许一个使用过的定义函数将有助于休眠。

     CREATE OR REPLACE FUNCTION date_part_in_zone
         ( part text, instant timestamptz, zone text) 
         returns double precision language sql as 
         'SELECT date_part(part, instant AT TIME ZONE zone)';
    

    上面的日期部分是“提取”背后的功能之一。

    【讨论】:

    • 这就是我要找的。现在我必须弄清楚如何让 hibernate 让我把它放在 HQL 查询中。它不喜欢它。
    • 哦!如果你在最初的问题中提到了休眠,我会......跑一英里。抱歉,我帮不上忙。
    • 您的回答仍然有帮助,谢谢!不幸的是,hql 不允许我在其中插入“AT TIME ZONE ..”子句。不知何故,我需要欺骗 hibernate 使其不将其解释为休眠调用,而只需将该子句插入 sql 中。
    • 也许你可以写一个用过的定义函数?
    • 据我所知,唯一的方法是从hibernate调用一个sql查询,但你不能通过HQL来做到这一点。 HQL 吓坏了“AT TIME ZONE”子句,你得到一个 HibernateQueryException。问题是我有大约 50 个复杂的查询,需要使用 AT TIME ZONE 进行提取,并且尝试通过直接 sql 来完成它们会令人难以置信。
    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多