Дата извлечения (yyyy/mm/dd) из метки времени в PostgreSQL

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

Каков наилучший способ извлечения даты (yyyy/mm/dd) из метки времени в PostgreSQL?

Ответ 1

Вы можете наложить метку времени на дату, добавив ее с помощью ::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)

Ответ 2

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

Ответ 3

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

Ответ 4

Это работает для меня в 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)

Ответ 6

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

Ответ 7

В postgres просто: TO_CHAR (timestamp_column, 'DD/MM/YYYY') как дата отправки