【问题标题】:Extract date (yyyy/mm/dd) from a timestamp in PostgreSQL从 PostgreSQL 中的时间戳中提取日期 (yyyy/mm/dd)
【发布时间】:2011-09-02 06:00:54
【问题描述】:

我想从 PostgreSQL 的时间戳中提取日期部分。

我需要它是 postgresql DATE 类型,以便我可以将它插入到另一个需要 DATE 值的表中。

例如,如果我有2011/05/26 09:00:00,我想要2011/05/26

我试过投射,但我只得到 2011:

timestamp:date
cast(timestamp as date)

我试过to_char()to_date()

SELECT to_date(to_char(timestamp, 'YYYY/MM/DD'), 'YYYY/MM/DD') 
FROM val3 WHERE id=1;

我试着把它变成一个函数:

CREATE OR REPLACE FUNCTION testing() RETURNS void AS '
DECLARE i_date DATE;
BEGIN
    SELECT to_date(to_char(val1, "YYYY/MM/DD"),"YYYY/MM/DD") 
      INTO i_date FROM exampTable WHERE id=1;
    INSERT INTO foo(testd) VALUES (i);
END

从 PostgreSQL 的时间戳中提取日期 (yyyy/mm/dd) 的最佳方法是什么?

【问题讨论】:

    标签: sql postgresql casting timestamp


    【解决方案1】:

    您可以通过添加::date 后缀将时间戳转换为日期。这里,在 psql 中,是一个时间戳:

    # select '2010-01-01 12:00:00'::timestamp;
          timestamp      
    ---------------------
     2010-01-01 12:00:00
    

    现在我们将其转换为日期:

    wconrad=# select '2010-01-01 12:00:00'::timestamp::date;
        date    
    ------------
     2010-01-01
    

    另一方面,您可以使用date_trunc 函数。它们之间的区别在于后者返回相同的数据类型,如 timestamptz 保持您的时区不变(如果需要)。

    => select date_trunc('day', now());
           date_trunc
    ------------------------
     2015-12-15 00:00:00+02
    (1 row)
    

    【讨论】:

    • 不起作用,只是尝试了“选择'2010-01-01 12:00:00'::timestamp::date;” .它只返回 2011 年。我已经尝试过 date(timestamp) 和 (timestamp)::date 但我只得到年份部分而不是我需要的完整日期。
    • @kerenk,现在很奇怪。你在 psql 里试过了吗?
    • @keren,psql 是一个命令行实用程序——您没有使用它(但请考虑一下)。当您在 pgadmin3 中执行查询时,请查看数据输出窗格。您可以调整列的大小;默认列大小太短,无法显示整个日期,仅显示年份。使用鼠标展开该列,您应该会看到整个内容。
    • 天哪,你是对的。我觉得很愚蠢。感谢您指出。
    • 我在 Squirrel 中遇到了一个不起作用的情况。使用这种语法,Squirrel 会给你一个输入框来输入参数“:date”的参数值。
    【解决方案2】:

    使用date函数:

    select date(timestamp_field) from table
    

    从字符字段表示到您可以使用的日期:

    select date(substring('2011/05/26 09:00:00' from 1 for 10));
    

    测试代码:

    create table test_table (timestamp_field timestamp);
    insert into test_table (timestamp_field) values(current_timestamp);
    select timestamp_field, date(timestamp_field) from test_table;
    

    测试结果:

    【讨论】:

    • 我试过了,但我只得到 2011 年作为回报,而不是像 2011/05/26 这样的完整日期
    • 我意识到您没有使用时间戳数据类型。修改为使用您提供的格式的时间戳的字符串表示形式。
    • 你是如何执行 sql 的? psql?
    • 我正在使用 pgAdmin III postgresSQL
    • 我注意到当我在 pgAdmin III 中执行测试时,“日期”列的宽度仅足以显示年份。抓住栏柄并展开栏以查看完整日期。
    【解决方案3】:

    您是否尝试过使用<mydatetime>::date 将其转换为日期?

    【讨论】:

    • 这很好用。正如 Wayne Conrad 的回答中的 cmets 所述,在 pgAdmin 的输出窗格中,keren 被一个过窄的列引入了歧途。
    【解决方案4】:

    这适用于我在 python 2.7 中

     select some_date::DATE from some_table;
    

    【讨论】:

      【解决方案5】:

      在 postgres 中: TO_CHAR(timestamp_column, 'DD/MM/YYYY') 作为提交日期

      【讨论】:

        【解决方案6】:

        只需执行select date(timestamp_column),您将获得唯一的日期部分。 有时执行select timestamp_column::date 可能会返回date 00:00:00,但不会删除00:00:00 部分。但我已经看到date(timestamp_column) 在所有情况下都能完美运行。希望这会有所帮助。

        【讨论】:

          【解决方案7】:
          CREATE TABLE sometable (t TIMESTAMP, d DATE);
          INSERT INTO sometable SELECT '2011/05/26 09:00:00';
          UPDATE sometable SET d = t; -- OK
          -- UPDATE sometable SET d = t::date; OK
          -- UPDATE sometable SET d = CAST (t AS date); OK
          -- UPDATE sometable SET d = date(t); OK
          SELECT * FROM sometable ;
                    t          |     d      
          ---------------------+------------
           2011-05-26 09:00:00 | 2011-05-26
          (1 row)
          

          另一个测试套件:

          SELECT pg_catalog.date(t) FROM sometable;
              date    
          ------------
           2011-05-26
          (1 row)
          
          SHOW datestyle ;
           DateStyle 
          -----------
           ISO, MDY
          (1 row)
          

          【讨论】:

          • 我刚刚在 pgAdmin 中尝试过你的,但 d 只有 2011 年不是我需要的完整日期! :(
          • @keren: SELECT pg_catalog.date('2011/05/26 09:00:00'); ?
          • 可能与格式化输出值有关。我在想返回值可能有日和月,但它只是没有显示在屏幕上?
          • 在 SHOW datestyle 中输入;游戏我“ISO,DMY”
          猜你喜欢
          • 1970-01-01
          • 2014-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-20
          • 1970-01-01
          • 2018-11-28
          相关资源
          最近更新 更多