从PostgreSQL的时间戳中提取日期(yyyy/mm/dd)

383
我希望从 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)的最佳方法是什么?

8个回答

618

你可以在时间戳后面加上::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)

3
刚刚尝试了 "select '2010-01-01 12:00:00'::timestamp::date;" ,但是没有成功。结果只返回了2011年,我已经尝试过 date(timestamp) 和 (timestamp)::date ,但是只得到了日期的年份部分,而不是我需要的完整日期。 - keren
2
@kerenk,现在这很奇怪。你试过在psql中运行吗? - Wayne Conrad
45
@keren,psql是一个命令行实用程序,你没有在使用它(但考虑一下)。当你在pgadmin3中执行查询时,请查看数据输出窗格。你可以调整列的大小;默认列大小太短,无法显示完整日期,只显示年份。使用你的鼠标来扩展该列,你应该能看到完整的日期。 - Wayne Conrad
13
哦,你说得对。我感觉好傻。谢谢你指出来。 - keren
这很有帮助..我现在也在使用pgsql..它让我头疼。让我试试这个解决方案... :) 提前加一。 - Arup Rakshit
显示剩余4条评论

149
使用日期函数: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;

测试结果:

pgAdmin 结果

pgAdmin 宽屏结果


1
我已经尝试过了,但是我只得到了2011年的返回结果,而不是完整的日期格式,例如2011/05/26。 - keren
我意识到你没有使用时间戳数据类型。已经进行了修改,以便使用你提供的时间戳字符串表示格式。 - James Allman
你是用什么方式执行 SQL 的?是用 psql 吗? - James Allman
我正在使用 pgAdmin III postgresSQL。 - keren
12
我注意到在pgAdmin III中执行测试时,“日期”列的宽度只能显示年份。请拖动列的手柄并扩展列以查看完整的日期。 - James Allman

22

你尝试过将其转换为日期吗?使用 <mydatetime>::date


1
这个很好用。正如在Wayne Conrad的回答评论中所指出的那样,keren被pgAdmin输出窗格中过于狭窄的列误导了。 - KenB

22

在PostgreSQL中,只需:

TO_CHAR(timestamp_column, 'DD/MM/YYYY') as submission_date

13

只需执行select date(timestamp_column),您将仅获得日期部分。 有时执行select timestamp_column::date可能会返回date 00:00:00,它并没有删除00:00:00部分。但是我已经看到date(timestamp_column)在所有情况下都可以完美地工作。希望这能帮到您。


13

这对我在Python 2.7中有效。

 select some_date::DATE from some_table;

5
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
@keren:SELECT pg_catalog.date('2011/05/26 09:00:00'); 这个怎么样? - Grzegorz Szpetkowski
可能与格式化输出值有关。我觉得返回值里可能包含了日期和月份,只是在屏幕上没有显示出来。 - keren
输入 SHOW datestyle; 给我返回 "ISO, DMY"。 - keren

1
您可以使用date_trunc('day', field)
select date_trunc('day', data_gps) as date_description from some_table;

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