生成一系列日期 - 使用日期类型作为输入

2023-12-07

文档 for generate_series说这个论点可以是int or bigint for generate_series(start, stop) and generate_series(start, stop, step)案例和timestamp or timestamp with time zone for generate_series(start, stop, step interval).

这是什么原因generate_series也适用于date键入作为输入并返回timestamp with timezone?

pg=# select generate_series('2014-01-01'::date,'2014-01-02'::date,'1 day');
    generate_series     
------------------------
 2014-01-01 00:00:00+01
 2014-01-02 00:00:00+01
(2 rows)

谢谢函数类型解析我们也可以通过date价值观generate_series()因为有一个implicit投射自date to timestamp以及来自date to timestamptz。会很暧昧,但是timestamptz is “首选”在“日期/时间类型”中。详细解释:

  • 在 PostgreSQL 中生成两个日期之间的时间序列

对于裸露的date当地时间00:00假定在演员阵容中。请注意,如果您使用,当前时区设置会直接影响结果date作为输入,因为显然“2014-01-10 00:00”代表东京与纽约不同的时间点。

Postgres 如何决定哪些类型是可接受的?

Postgres 基本上区分三种类型的演员表:

Explicit casts..使用时CAST or :: syntax.
Assignment cast.. 将值分配给目标列时的隐式转换。
Implicit cast.. 所有其他表达式中的隐式转换。

必须有一个implicit将在系统中注册的从输入类型转换为预期类型,以使函数默默地接受(并转换)输入值。

查看定义了哪些强制转换to timestamptz,可以查询catalog表pg_cast:

SELECT castsource::regtype, casttarget::regtype, castcontext
FROM   pg_cast
WHERE  casttarget = 'timestamptz'::regtype;

         castsource          |        casttarget        | castcontext
-----------------------------+--------------------------+-------------
 abstime                     | timestamp with time zone | i
 date                        | timestamp with time zone | i
 timestamp without time zone | timestamp with time zone | i
 timestamp with time zone    | timestamp with time zone | i

所有这些演员都是implicit。手册上castcontext:

指示可以在哪些上下文中调用转换。e意味着仅作为 显式强制转换(使用CAST or ::句法)。a隐含地意味着 分配给目标列,以及显式分配。i方法 隐含在表达式中,以及其他情况。

大胆强调我的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成一系列日期 - 使用日期类型作为输入 的相关文章

随机推荐