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


250

Я хочу извлечь только часть даты из метки времени в PostgreSQL.

Мне нужно, чтобы это был DATEтип postgresql, чтобы я мог вставить его в другую таблицу, которая ожидает 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?

Ответы:


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 предоставит вам поле для ввода значений параметров для параметра «: date».
Джеймс Кингсбери

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
Керен

Я понял, что вы не работаете с типом данных timetamp. Пересмотрен для работы со строковым представлением отметки времени в указанном вами формате.
Джеймс Оллман

Как вы выполняете sql? PSQL?
Джеймс Оллман

я использую pgAdmin III postgresSQL
керен

11
Я заметил, что когда я выполняю тест в pgAdmin III, столбец «date» достаточно широк, чтобы отображать год. Возьмите ручку столбца и разверните столбец, чтобы увидеть полную дату.
Джеймс Оллман

10

Вы пытались назначить это на свидание, с <mydatetime>::date?


1
Это работает просто отлично. Как отмечалось в комментариях к ответу Уэйна Конрада, Керен был сбит с толку из-за слишком узкой колонки в панели вывода pgAdmin.
KenB


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, но у меня только 2011 год не полный, который мне нужен! :(
Керен

@keren: как насчет SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Гжегож Шпетковски,

возможно, это как-то связано с форматированием выходного значения. Я думаю, что возвращаемое значение, вероятно, имеет день и месяц, но его просто не показывается на экране?
Керен

набрав в SHOW datestyle; игра меня "ISO, DMY"
Керен

4

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.