Извлечь дату (гггг / мм / дд) из отметки времени в PostgreSQL - PullRequest
209 голосов
/ 26 мая 2011

Я хочу извлечь только часть даты из отметки времени в 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?

Ответы [ 6 ]

377 голосов
/ 26 мая 2011

Вы можете привести свою временную метку к дате, добавив к ней суффикс ::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)
88 голосов
/ 26 мая 2011

Используйте функцию 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 result

pgAdmin result wide

9 голосов
/ 26 мая 2011

Вы пытались привести его к дате, с <mydatetime>::date?

8 голосов
/ 12 января 2017

Это работает для меня в Python 2.7

 select some_date::DATE from some_table;
3 голосов
/ 26 мая 2011
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)
2 голосов
/ 17 апреля 2018

Просто сделайте select date(timestamp_column), и вы получите только часть даты.Иногда выполнение select timestamp_column::date может вернуть date 00:00:00 там, где не удаляется часть 00:00:00.Но я видел, что date(timestamp_column) отлично работает во всех случаях.Надеюсь, это поможет.

...