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

ker*_*ren 221 sql postgresql timestamp casting

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

我需要它是一个postgresql DATE类型,所以我可以将它插入到另一个DATE期望值的表中.

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

我试过铸造,但我只得到2011年:

timestamp:date
cast(timestamp as date)
Run Code Online (Sandbox Code Playgroud)

我尝试to_char()to_date():

SELECT to_date(to_char(timestamp, 'YYYY/MM/DD'), 'YYYY/MM/DD') 
FROM val3 WHERE id=1;
Run Code Online (Sandbox Code Playgroud)

我试着让它成为一个功能:

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
Run Code Online (Sandbox Code Playgroud)

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

Way*_*rad 399

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

# select '2010-01-01 12:00:00'::timestamp;
      timestamp      
---------------------
 2010-01-01 12:00:00
Run Code Online (Sandbox Code Playgroud)

现在我们将它投射到一个日期:

wconrad=# select '2010-01-01 12:00:00'::timestamp::date;
    date    
------------
 2010-01-01
Run Code Online (Sandbox Code Playgroud)

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

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

  • @keren,psql是一个命令行实用程序 - 你没有使用它(但要考虑它).在pgadmin3中执行查询时,请查看数据输出窗格.您可以调整列的大小; 默认列大小太短,无法显示整个日期,仅显示年份.使用鼠标展开该列,您应该看到整个事情. (39认同)
  • 你是对的.我觉得很蠢.谢谢你指出来. (11认同)
  • 不起作用,只是尝试"选择'2010-01-01 12:00:00':: timestamp :: date;" .它只返回2011年.我已经尝试了日期(时间戳)和(时间戳)::日期,但我只得到年份部分作为回报而不是我需要的完整日期. (3认同)
  • @kerenk,现在*这*奇怪。你在 psql 中尝试过吗? (2认同)

jam*_*man 93

使用日期功能:

select date(timestamp_field) from table
Run Code Online (Sandbox Code Playgroud)

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

select date(substring('2011/05/26 09:00:00' from 1 for 10));
Run Code Online (Sandbox Code Playgroud)

测试代码:

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;
Run Code Online (Sandbox Code Playgroud)

测试结果:

pgAdmin结果

pgAdmin结果广泛

  • 我注意到当我在pgAdmin III中进行测试时,'date'列只有足够宽以显示年份.抓住列手柄并展开列以查看完整日期. (11认同)

leo*_*loy 10

你试过把它投到约会<mydatetime>::date吗?


小智 9

这在python 2.7中适用于我

 select some_date::DATE from some_table;
Run Code Online (Sandbox Code Playgroud)


Elm*_*zad 8

在 postgres 中简单地:TO_CHAR(timestamp_column, 'DD/MM/YYYY') 作为 submit_date


Kou*_*Das 7

只要这样做select date(timestamp_column),你就会得到唯一的日期部分。有时这样做select timestamp_column::date可能会返回date 00:00:00它没有移除00:00:00零件的地方。但我已经看到date(timestamp_column)在所有情况下都能完美地工作。希望这可以帮助。


Grz*_*ski 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)
Run Code Online (Sandbox Code Playgroud)

另一个测试套件:

SELECT pg_catalog.date(t) FROM sometable;
    date    
------------
 2011-05-26
(1 row)

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)
Run Code Online (Sandbox Code Playgroud)