Дата вилучення (р / р / мм / дд) з часової позначки в 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 ':: часова марка :: дата; " . він повертається тільки в 2011 році. Я вже пробував дату (часова марка) і (часова марка) :: дата, але я отримую лише частку року, а не повну дату, яка мені потрібна.
керен

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

Я зрозумів, що ти не працюєш із типом даних часової позначки. Переглянуто для роботи зі строковим поданням часової позначки у наданому вами форматі.
Джеймс Аллман

Як ви виконуєте sql? psql?
Джеймс Аллман

Я використовую pgAdmin III postgresSQL
keren

11
Я помітив, коли виконую тест на pgAdmin III, стовпець "дата" є достатньо широким, щоб відобразити рік. Візьміть за ручку стовпця та розгорніть стовпчик, щоб побачити повну дату.
Джеймс Аллман

10

Чи намагалися ви віддати це на побачення <mydatetime>::date?


1
Це працює просто чудово. Як зазначалося в коментарях до відповіді Уейна Конрада, керен був заблуджений надто вузьким стовпцем на вихідній панелі pgAdmin.
КенБ


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, але у d тільки 2011 рік не є повною датою, яка мені потрібна! :(
keren

@keren: як щодо SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Spepetkowski

можливо, це має щось спільне з форматуванням вихідного значення. Я думаю, що повернене значення, ймовірно, має день і місяць там, але його просто не показано на екрані?
керен

набрати в SHOW datestyle; гра мені "ISO, DMY"
keren

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.