【问题标题】:PostgreSQL: SELECT integers as DATE or TIMESTAMPPostgreSQL:选择整数作为 DATE 或 TIMESTAMP
【发布时间】:2013-07-16 09:16:24
【问题描述】:

我有一个表,其中有多个整数列:年、月和日。不幸的是,虽然这三个应该从一开始就被分组到一个 DATE 列中,但我现在被卡住了,现在需要这样查看它。是否有一个函数可以做一些事情:

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

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

【问题讨论】:

  • 出于兴趣,您习惯将makedatemaketimestamp 放入哪个数据库?文档链接?我想确保 PostgreSQL 版本是一致的。
  • 我没有考虑任何特定的数据库。但我认为 MySQL 有一些类似于 makedate 的东西(虽然它不使用月份)。
  • 是的,我就是这个意思。无论哪种情况,我都觉得不包括这些功能有点奇怪。

标签: sql postgresql date


【解决方案1】:

你可以

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

好的,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)

【讨论】:

    【解决方案2】:

    PostgreSQL 9.4+

    PostgreSQL 9.4 中,添加了一个函数来执行此操作

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        尝试类似:

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

        【讨论】:

        • 我认为您必须将其添加到日期才能获得日期类型的结果——我认为它给出了一个间隔。
        猜你喜欢
        • 2015-06-27
        • 2021-02-08
        • 2011-11-21
        • 2015-12-25
        • 2020-02-11
        • 1970-01-01
        • 2013-07-06
        • 2016-05-28
        相关资源
        最近更新 更多