ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

timestamp:date
cast(timestamp as date)

我用 to_date() 尝试了 to_char()

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


k
kworr

您可以通过添加 ::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”的参数值。
J
James Allman

使用 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;

测试结果:

https://i.stack.imgur.com/bLemz.png

https://i.stack.imgur.com/uWK12.png


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

在 postgres 中:

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

l
leonbloy

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


这工作得很好。正如对 Wayne Conrad 回答的评论中所指出的, keren 被 pgAdmin 的输出窗格中的一个过窄的列引入了歧途。
t
thedarkgriffen

这在 python 2.7 中对我有用

 select some_date::DATE from some_table;

K
Koushik Das

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


G
Grzegorz Szpetkowski
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”
R
Ricardo Emerson

您可以使用 date_trunc('day', field)

select date_trunc('day', data_gps) as date_description from some_table;