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

时间:2014-01-10 13:43:11

标签: postgresql types timestamp postgresql-9.1 generate-series

generate_series的{​​{3}}表示intbigint个案例和generate_series(start, stop)generate_series(start, stop, step)timestamptimestamp with time zonegenerate_series(start, stop, step interval)generate_series date的{​​{1}}。

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) 类型用作输入并返回{{1}},这是什么原因?

{{1}}

1 个答案:

答案 0 :(得分:6)

感谢function type resolution我们还可以将date值传递给generate_series(),因为从date到{{1}有隐式广告}以及从timestampdate。不明确,但“日期/时间类型”中timestamptz “首选”。详细解释:

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

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

Postgres基本上区分three types of casts

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

必须在系统中注册从输入类型到期望类型的隐式强制转换,才能使函数静默接受(并转换)输入值。

要查看哪些演员表已定义 Implicit cast,您可以查询目录表pg_cast

timestamptz

所有这些演员都是隐式的。关于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仅表示为   显式强制转换(使用eCAST语法)。 ::隐含地表示   分配给目标列,以及显式分配。 a表示   隐含在表达式中,以及其他情况。

大胆强调我的。