PostgreSQL:将整数作为日期或时间戳选择

4

我有一个表格,其中有多个整数列:年份、月份和日期。不幸的是,这三个应该从一开始就被分组为一个日期列,但现在我卡住了,现在需要将它视为这样。是否有一个函数可以做类似以下的事情:

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

或者

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

你平常使用哪个数据库来支持 makedatemaketimestamp 函数?有相关的文档链接吗?我想确保 PostgreSQL 版本的一致性。 - Craig Ringer
我并没有考虑任何特定的数据库。但我认为MySQL有类似于makedate的功能(虽然它不使用月份)。 - TimY
它可以,但需要一年和一天。根据手册看起来MySQL也没有像您描述的东西 - Craig Ringer
是的,那就是我的意思。无论哪种情况,我都觉得这些函数没有被包含进来有点奇怪。 - TimY
4个回答

11

你可以

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)

2

1

可能有更优雅的方法,但这将给你一个日期。

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

-1

尝试类似这样的内容:

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

1
我认为你需要将其添加到日期上才能获得日期类型的结果——它会给出一个时间间隔,我想。 - David Aldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接