Извлечь дату (гггг / мм / дд) из отметки времени в PostgreSQL

145

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

Теги:

5 ответов

268
Лучший ответ

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

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

Результат теста:

Изображение 5097

Изображение 5098

  • 1
    я пробовал это, но я получаю 2011 год взамен полной даты, как 2011/05/26
  • 0
    Я понял, что вы не работаете с типом данных timetamp. Пересмотрен для работы со строковым представлением отметки времени в указанном вами формате.
Показать ещё 4 комментария
6

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

  • 0
    да, у меня только 2011 год. Я не понимаю почему.
  • 1
    Это работает просто отлично. Как отмечено в комментариях к ответу Уэйна Конрада, Керен был введен в заблуждение из-за слишком узкой колонки в панели вывода pgAdmin.
3

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

 select some_date::DATE from some_table;
2
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)
  • 0
    Я только что попробовал ваш в pgAdmin, но у меня только 2011 не полная дата, в которой я нуждался! :(
  • 0
    @keren: как насчет SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню