PostgreSQL의 타임 스탬프에서 날짜 추출 (yyyy / mm / dd)


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의 타임 스탬프에서 날짜 (yyyy / mm / dd)를 추출하는 가장 좋은 방법은 무엇입니까?

답변:


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
작동하지 않습니다. "select '2010-01-01 12:00:00':: timestamp :: date;" . 그것은 이미 2011 년을 반환합니다. 나는 이미 date (timestamp) 및 (timestamp) :: date을 시도했지만 필요한 전체 날짜가 아닌 연도 부분 만 가져옵니다.
keren

1
@kerenk, 이제 그건 이상한. psql에서 사용해 보셨습니까?
Wayne Conrad

40
@keren, psql은 명령 행 유틸리티입니다. 사용하지는 않지만 고려하십시오. pgadmin3에서 쿼리를 실행할 때 데이터 출력 창을보십시오. 열의 크기를 조정할 수 있습니다. 기본 열 크기가 너무 짧아서 전체 날짜를 표시 할 수없고 연도 만 표시됩니다. 마우스를 사용하여 해당 열을 확장하면 모든 것을 볼 수 있습니다.
Wayne Conrad

11
당신이 맞아요 너무 바보 같아 지적 해 주셔서 감사합니다.
keren

이것이 작동하지 않는 한 가지 경우는 다람쥐입니다. 이 구문을 사용하면 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/05/26과 같은 전체 날짜 대신에 2011 만 반환합니다
keren

타임 스탬프 데이터 형식으로 작업하고 있지 않다는 것을 깨달았습니다. 제공 한 형식으로 타임 스탬프의 문자열 표현을 사용하도록 수정되었습니다.
James Allman

SQL을 어떻게 실행하고 있습니까? psql?
James Allman

pgAdmin III postgresSQL을 사용하고 있습니다
keren

11
pgAdmin III에서 테스트를 수행 할 때 '날짜'열이 연도를 표시하기에 충분히 넓습니다. 열 핸들을 잡고 열을 확장하여 전체 날짜를 확인하십시오.
James Allman

10

날짜와 함께 날짜를 보내려고 했습니까 <mydatetime>::date?


1
이것은 잘 작동합니다. Wayne Conrad의 답변에 대한 의견에서 언급했듯이 keren은 pgAdmin의 출력 창에서 지나치게 좁은 열로 길을 잃었습니다.
KenB

9

이것은 파이썬 2.7에서 작동합니다.

 select some_date::DATE from some_table;

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 Szpetkowski 3:26에

출력 값을 형식화하는 것과 관련이있을 수 있습니다. 나는 반환 값에 아마도 일과 월이있을 것이라고 생각하지만 그 스크린에는 표시되지 않습니까?
keren

SHOW 날짜 스타일 입력; 게임 "ISO, DMY"
keren

4

그냥 select date(timestamp_column)하고 날짜 부분 만 얻으십시오. 때로는 부품을 제거하지 않은 곳에서 작업을 수행 select timestamp_column::date할 수 있습니다 . 그러나 모든 경우에 완벽하게 작동하는 것을 보았습니다 . 도움이 되었기를 바랍니다.date 00:00:0000:00:00date(timestamp_column)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.