关于postgresql:生成一系列日期 – 使用日期类型作为输入

Generate series of dates - using date type as input

generate_series的文档说明对于generate_series(start, stop)generate_series(start, stop, step)情况,参数可以是intbigint,对于generate_series(start, stop, step interval),参数可以是timestamptimestamp with time zone

generate_series也可以使用date类型作为输入并返回timestamp with timezone的原因是什么?

1
2
3
4
5
6
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(),因为存在从datetimestamp以及从datetimestamptz的隐式转换。会有歧义,但timestamptz在"日期/时间类型"中是"首选"。详细说明:

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

对于裸date,在演员表中假设本地时间00:00。请注意,如果使用date作为输入,则当前时区设置会直接影响结果,因为很明显,"2014-01-10 00:00"代表Tokio中与纽约不同的时间点。

Postgres如何确定哪些类型可以接受?

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

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

系统中必须存在从输入类型到预期类型的??隐式转换,以使函数静默接受(和转换)输入值。

要查看哪些强制转换定义为timestamptz,您可以查询目录表pg_cast

1
2
3
4
5
6
7
8
9
10
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

所有这些演员都是隐含的。关于castcontext的每个文档:

Indicates what contexts the cast can be invoked in. e means only as an
explicit cast (using CAST or :: syntax). a means implicitly in
assignment to a target column, as well as explicitly. i means
implicitly in expressions, as well as the other cases.

大胆强调我的。