生成一系列日期 - 使用日期类型作为输入
Posted
技术标签:
【中文标题】生成一系列日期 - 使用日期类型作为输入【英文标题】:Generate series of dates - using date type as input 【发布时间】:2014-01-29 12:29:04 【问题描述】:Documentation for generate_series
表示参数可以是 int
或 bigint
for generate_series(start, stop)
和 generate_series(start, stop, step)
case 和 timestamp
或 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)
【问题讨论】:
请注意,我原来的解释有错误。几年过去了,但您可能仍然对更新感兴趣。 【参考方案1】:感谢function type resolution,我们还可以将date
值传递给generate_series()
,因为存在从date
到timestamp
以及从date
到@ 的隐式转换987654331@。会模棱两可,但timestamptz
在“日期/时间类型”中是“首选”。详细解释:
对于纯date
,本地时间00:00
假定在演员表中。请注意,如果您使用 date
作为输入,则当前时区设置会直接影响结果,因为很明显,“2014-01-10 00:00”在 Tokio 代表的时间点与在纽约的时间点不同。
Postgres 如何决定可接受的类型?
Postgres 基本区分three types of casts:
Explicit casts
.. 使用 CAST
或 ::
语法时。Assignment cast
.. 将值分配给目标列时的隐式转换。Implicit cast
.. 隐式转换所有其他表达式。
必须在系统中注册一个从输入类型到预期类型的隐式强制转换,以使函数静默接受(并转换)输入值。
要查看到 timestamptz
定义了哪些类型转换,您可以查询目录表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
所有这些转换都是隐式的。根据castcontext
上的文档:
指示可以在哪些上下文中调用强制转换。
e
仅表示 显式转换(使用CAST
或::
语法)。a
表示隐含在 分配给目标列,以及显式。i
表示 隐含在表达式中,以及其他情况。
我的大胆强调。
【讨论】:
以上是关于生成一系列日期 - 使用日期类型作为输入的主要内容,如果未能解决你的问题,请参考以下文章
作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词