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


250

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

Answers:


432

您可以通过在时间戳后缀将时间戳转换为日期::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
不起作用,只需尝试“选择'2010-01-01 12:00:00':: timestamp :: date;” 。它只返回2011年。我已经尝试过date(timestamp)和(timestamp):: date,但是我只得到年份部分作为回报,而不是我需要的完整日期。
基伦

1
@kerenk,这很奇怪。您是否在psql中尝试过?
韦恩·康拉德

40
@ keren,psql是一个命令行实用程序-您没有使用它(但是请考虑使用它)。在pgadmin3中执行查询时,请查看数据输出窗格。您可以调整列的大小;默认列大小太短,无法显示整个日期,仅显示年份。用鼠标展开该列,您应该会看到整个内容。
韦恩·康拉德

11
天哪,你是对的。我觉得很傻。感谢您指出。
基伦

我遇到一个不起作用的案例是在Squirrel中。使用这种语法,Squirrel将为您提供一个输入框,以输入参数“:date”的参数值。
James Kingsbery 2012年

104

使用日期功能:

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

我意识到您不使用时间戳数据类型。修改后可以使用您提供的格式的时间戳记的字符串表示形式。
詹姆斯·奥尔曼

您如何执行sql?psql的?
詹姆斯·奥尔曼

我正在使用pgAdmin III postgresSQL
keren

11
我注意到,当我在pgAdmin III中执行测试时,“日期”列仅足以显示年份。抓住列手柄并展开列以查看完整日期。
詹姆斯·奥尔曼

10

您是否尝试过将其与日期约会<mydatetime>::date


1
这很好。正如韦恩·康拉德(Wayne Conrad)对答案的评论中所指出的那样,由于pgAdmin的输出窗格中的列过窄,使keren误入歧途。
KenB 2014年


4
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'); ?
2011年

也许与格式化输出值有关。我在想返回值可能在那里有日和月,但只是没有显示在屏幕上?
基伦

输入SHOW datestyle; 游戏我“ ISO,DMY”
基伦

4

只要这样做select date(timestamp_column),您将获得唯一的日期部分。有时,做某事select timestamp_column::date可能会date 00:00:00在不删除00:00:00零件的地方返回。但是我看到date(timestamp_column)在所有情况下都能完美工作。希望这可以帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.