PostgreSQL:SELECT整数为DATE或TIMESTAMP

时间:2013-07-16 09:16:24

标签: sql postgresql date

我有一个表,我有多个整数列:年,月和日。不幸的是,虽然三个应该从一开始就被分组到一个DATE列,但我现在卡住了,现在需要查看它。是否有一个函数可以执行以下操作:

SELECT makedate(year, month, day), othercolumn FROM tablename;

SELECT maketimestamp(year, month, day, 0, 0), othercolumn FROM tablename;

4 个答案:

答案 0 :(得分:10)

你可以

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

好的,now here's a simple makedate extension添加了一个用C实现的单个函数,名为makedate。如果您不想编译和安装扩展,还提供了纯SQL版本。我将为9.4 commitfest提交C函数;同时可以安装该扩展以提供快速简单的日期构造函数:

regress=# SELECT makedate(2012,01,01);
  makedate  
------------
 2012-01-01
(1 row)

答案 1 :(得分:1)

可能有更优雅的方法,但这会给你一个约会。

select to_date(to_char(year * 10000 + month * 100 + day,'00000000'), 'yyyymmdd')
from   tablename;

答案 2 :(得分:1)

PostgreSQL 9.4 +

PostgreSQL 9.4中,添加了一个功能来执行此操作

答案 3 :(得分:-1)

尝试类似:

SELECT year * interval '1 year' + 
       month * interval '1 month' + 
       day * interval '1 day'
FROM tablename;