我有一个表,其中有多个整数列:年、月和日。不幸的是,虽然这三个应该从一开始就被分组到一个 DATE 列中,但我现在被卡住了,现在需要这样查看它。是否有一个功能可以做一些事情:
SELECT makedate(year, month, day), othercolumn FROM tablename;
或者
SELECT maketimestamp(year, month, day, 0, 0), othercolumn FROM tablename;
我有一个表,其中有多个整数列:年、月和日。不幸的是,虽然这三个应该从一开始就被分组到一个 DATE 列中,但我现在被卡住了,现在需要这样查看它。是否有一个功能可以做一些事情:
SELECT makedate(year, month, day), othercolumn FROM tablename;
或者
SELECT maketimestamp(year, month, day, 0, 0), othercolumn FROM tablename;
你可以
SELECT format('%s-%s-%s', "year", "month", "day")::date
FROM ...
或使用日期数学:
SELECT DATE '0001-01-01'
+ ("year"-1) * INTERVAL '1' YEAR
+ ("month"-1) * INTERVAL '1' MONTH
+ ("day"-1) * INTERVAL '1' DAY
FROM ...
坦率地说,令人惊讶的是 PostgreSQL 没有像您描述的那样提供日期构造函数。这是我应该考虑为其编写补丁的事情。
事实上,快速浏览一下源代码就会发现,int date2j(int y, int m, int d)
在 C 级别已经有一个函数,在src/backend/utils/adt/datetime.c
. 它只需要在 SQL 级别使用包装器公开即可转换为Datum
.
好的,现在这是一个简单的makedate
扩展,它添加了一个用 C 实现的函数,名为makedate
. 如果您不想编译和安装扩展,还提供纯 SQL 版本。我将为 9.4 commitfest 提交 C 函数;同时可以安装该扩展以提供快速简单的日期构造函数:
regress=# SELECT makedate(2012,01,01);
makedate
------------
2012-01-01
(1 row)
可能有更优雅的方法,但这会给你一个约会。
select to_date(to_char(year * 10000 + month * 100 + day,'00000000'), 'yyyymmdd')
from tablename;
尝试类似:
SELECT year * interval '1 year' +
month * interval '1 month' +
day * interval '1 day'
FROM tablename;