我有一个表格,其中有多个整数列:年份、月份和日期。不幸的是,这三个应该从一开始就被分组为一个日期列,但现在我卡住了,现在需要将它视为这样。是否有一个函数可以做类似以下的事情:
SELECT makedate(year, month, day), othercolumn FROM tablename;
或者
SELECT maketimestamp(year, month, day, 0, 0), othercolumn FROM tablename;
我有一个表格,其中有多个整数列:年份、月份和日期。不幸的是,这三个应该从一开始就被分组为一个日期列,但现在我卡住了,现在需要将它视为这样。是否有一个函数可以做类似以下的事情:
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没有像你描述的日期构造函数是令人惊讶的。这是我应该考虑编写补丁的事情。
实际上,快速查看源代码显示,C级别已经有一个名为int date2j(int y, int m, int d)
的函数,在src/backend/utils/adt/datetime.c
中。它只需要通过包装器在SQL级别公开并转换为Datum
即可。
好的,现在这里有一个简单的makedate
扩展程序,它添加了一个用C实现的单个函数,名为makedate
。如果您不想编译和安装扩展程序,则还提供了纯SQL版本。我将为9.4提交节目的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;
makedate
和maketimestamp
函数?有相关的文档链接吗?我想确保 PostgreSQL 版本的一致性。 - Craig Ringer