앞에서 날짜,시간 형식 type에 대해 알아보았고, 이어서 날짜,시간 함수 활용법에 대하여 알아보고자 한다.

우선 기본적으로 현재 시간(DB기준)을 확인하는 함수는 아래와 같다.

 
select now();
--출력결과(예시) : 2023-01-25 05:29:19.793694+00
 
 
주요함수로 date_part() 가 있는데 해당 함수를 이용해서 날짜 or 시간값에서 연도, 월, 주등과 같은 정보를 검색 할 수 있다.
추가로 extract() 함수도 존재하나 흡사한 방식으로 사용가능하다. (참고)
 
[ 필요인자 ]
 
인자값 정의
CENTURY 1세기는 서기 0001-01-01 00:00:00 시작되지만 당시에는 몰랐습니다. 정의는 모든 그레고리오력 국가에 적용됩니다. 세기 숫자 0 없으며 -1 세기에서 1 세기로 이동합니다. 이에 동의하지 않는 경우 다음 주소로 불만 사항을 작성하십시오: 교황, 로마 베드로 대성당, 바티칸.
DAY 값의 경우 일(월) 필드(1–31) ; 값의 경우 일 수timestampinterval
DECADE 연도 필드를 10으로 나눈
DOW 일요일(0)에서 토요일(6)
DOY 연도의 날짜(1–365/366)
EPOCH 값의 경우 1970-01-01 00:00:00 UTC 이후의 초 수입니다(그 이전의 타임스탬프에 대해서는 음수). for 및 값, 시간대 또는 일광 절약 시간에 관계없이 1970-01-01 00:00:00 이후의 공칭 초 수입니다. 값의 경우 간격의 총 시간(초)timestamp with time zonedatetimestampinterval
HOUR 시간 필드(0–23)
ISODOW 월요일(1)에서 일요일(7)
ISOYEAR 날짜가 속하는 ISO 8601 번호 매기기 연도(간격에는 적용되지 않음)
JULIAN 날짜 또는 타임스탬프에 해당하는 율리우스력 날짜입니다(간격에는 적용되지 않음). 로컬 자정이 아닌 타임스탬프는 소수 값이 됩니다
MICROSECONDS () 필드(소수 부분 포함) 1,000,000 곱합니다. 여기에는 전체 초가 포함됩니다
MILLENNIUM 복천년 - (1900년대는 번째 천년기입니다. 번째 천년기는 2001 1 1일에 시작되었습니다.)
MILLISECONDS () 필드(소수 부분 포함) 1000 곱합니다. 여기에는 전체 초가 포함됩니다.
MINUTE 필드(0–59)
MONTH 값의 경우 연도 내의 월 수(1–12) ; 값의 경우 개월 수,
QUARTER 날짜가 있는 연도의 분기(1–4)
SECOND () 필드(소수 자릿수 포함)
WEEK 해당 연도의 ISO 8601 주 번호 매기기 주의 번호입니다. 정의에 따라 ISO 주는 월요일에 시작하고 연도의 첫 번째 주에는 해당 연도의 1월 4일이 포함됩니다. 즉, 연도의 첫 번째 목요일은 해당 연도의 1주차에 있습니다.

ISO
주 번호 매기기 시스템에서는 1월 초 날짜가 전년도의 52번째 주 또는 53번째 주에 속하고 12월 말 날짜가 다음 해 첫 번째 주에 포함될 수 있습니다. 예를 들어 는 2004년 53번째 주의 일부이고, 는 2005년의 52번째 주의 일부이며, 는 2013년 첫째 주의 일부입니다. 일관된 결과를 얻으려면 필드를 함께 사용하는 것이 좋습니다.
YEAR 연도 필드입니다. 는 없으므로 몇 년에서 몇 년을 빼는 것은 주의해서 수행해야 합니다.

 

[ 관련예시 ]

select date_part('CENTURY'     , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 21

select date_part('DAY'         , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 25

select date_part('DECADE'      , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 202

select date_part('DOW'         , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 3

select date_part('DOY'         , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 25

select date_part('EPOCH'       , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 1674656360.01846

select date_part('HOUR'        , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 14

select date_part('ISODOW'      , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 3

select date_part('ISOYEAR'     , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 2023

select date_part('JULIAN'      , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 2459970.59675928

select date_part('MICROSECONDS', '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 20018460

select date_part('MILLENNIUM'  , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 3

select date_part('MILLISECONDS', '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 20018.46

select date_part('MINUTE'      , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 19

select date_part('MONTH'       , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 1

select date_part('QUARTER'     , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 1

select date_part('SECOND'      , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 20.01846

select date_part('WEEK'        , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 4

select date_part('YEAR'        , '2023-01-25 14:19:20.01846'::timestamp);
--출력결과(예시) : 2023
 

#참조 : PostgreSQL: Documentation: 15: 9.9. Date/Time Functions and Operators

이번에는 날짜/시간 형식에 알아보도록 하겠다.

형식 크기 설명 별칭
timestamp [(p)] [without time zone] 8 바이트 날짜와 시간 모두  
timestamp [(p)] [with time zone] 8 바이트 날짜와 시간 모두 시간대 포함 timestamptz
interval [(p)] 12 바이트 시간 간격  
date 4 바이트 날짜  
time [(p)] [without time zone] 8 바이트 시간  
time [(p)] with time zone 12 바이트 시간, 시간대 첨부 timetz

해당 타입으로 구성 할 수 있는 형태는 date, time, timestamp(date + ' ' + time) 세가지가 존재 하며, 아래와 같은 형태의 데이터 값을 사용 할 수 있다.

1. Dates

Example Description
1999-01-08 ISO 8601; January 8 in any mode (recommended format)
January 8, 1999 unambiguous in any input modedatestyle
1/8/1999 January 8 in mode; August 1 in modeMDYDMY
1/18/1999 January 18 in mode; rejected in other modesMDY
01/02/03 January 2, 2003 in mode; February 1, 2003 in mode; February 3, 2001 in modeMDYDMYYMD
1999-Jan-08 January 8 in any mode
Jan-08-1999 January 8 in any mode
08-Jan-1999 January 8 in any mode
99-Jan-08 January 8 in mode, else errorYMD
08-Jan-99 January 8, except error in modeYMD
Jan-08-99 January 8, except error in modeYMD
19990108 ISO 8601; January 8, 1999 in any mode
990108 ISO 8601; January 8, 1999 in any mode
1999.008 year and day of year
J2451187 Julian date
January 8, 99 BC year 99 BC

 

2-1. Times

Example Description
04:05:06.789 ISO 8601
04:05:06 ISO 8601
04:05 ISO 8601
040506 ISO 8601
04:05 AM same as 04:05; AM does not affect value
04:05 PM same as 16:05; input hour must be <= 12
04:05:06.789-8 ISO 8601, with time zone as UTC offset
04:05:06-08:00 ISO 8601, with time zone as UTC offset
04:05-08:00 ISO 8601, with time zone as UTC offset
040506-08 ISO 8601, with time zone as UTC offset
040506+0730 ISO 8601, with fractional-hour time zone as UTC offset
040506+07:30:00 UTC offset specified to seconds (not allowed in ISO 8601)
04:05:06 PST time zone specified by abbreviation
2003-04-12 04:05:06 America/New_York time zone specified by full name

2-2. Times Zone Input

Example Description
PST Abbreviation (for Pacific Standard Time)
America/New_York Full time zone name
PST8PDT POSIX-style time zone specification
-8:00:00 UTC offset for PST
-8:00 UTC offset for PST (ISO 8601 extended format)
-800 UTC offset for PST (ISO 8601 basic format)
-8 UTC offset for PST (ISO 8601 basic format)
zulu Military abbreviation for UTC
z Short form of (also in ISO 8601)zulu

#참조 : PostgreSQL: Documentation: 11: 8.5. Date/Time Types

 

※ 해당 내용은 날짜/시간 형식에 대해서만 기술해 보았다.

    이런 타입을 통해서 다양한 활용이 가능한데 이부분은 추후 알아 볼 예정입니다. ^^

3-2와 같이 테이블 스키마 권한을 부여했지만 select시 없는 테이블로 나옴.

ERROR: relation "ods.test" does not exist LINE 2: from "ods".test ^ SQL state: 42P01 Character: 20
SQL state : 42P01

ERROR:  permission denied for schema mart
SQL state: 42501

아래와 같이 권한 부여에도 테이블 조회가 되지 않는다.
GRANT SELECT ON ALL TABLES IN SCHEMA ods TO adbuser;

 

/*권한부여된 테이블 조회하기*/
select table_schema, table_name
from information_schema.tables
where not table_schema='pg_catalog'
and not table_schema='information_schema';

해당문제를 팀원과 같이 알아보던중 해결책을 찾을 수 있었다.

------------------------------------------------------------------------------------------------
GRANT
USAGE ON SCHEMA <schema_name> TO <db_user>;
------------------------------------------------------------------------------------------------

해당 구문을 실행하여... 스키마를 사용 할 수 있는 권한을 부여해줘야 한다.
분명이 table select등 권한을 부여했음에도 또 저런 구문을 이용하여 줘야 되는지? 의문이 들었다.

이 부분은 기존에 GRANT SELELC ON~ 명령이 스키마안의 테이블에 대한 권한을 부여하는거라면 스키마 자체또한 객체로 보고, 해당 객체(스키마)에도 접속할 수 있는 액세스 권한을 부여하여야 하기에 GRANT USAGE ON SCHEMA 명령을 사용해야 되는걸로 확인되었다.

※ 여러 MS Azure Doc사이트 문서, 인터넷 검색등을 통해서도 저부분까지 표기되어 있는부분이 별로 없었다.
  실제 테스트를 기본적으로 제공되는 'public' 스키마를 써서 할텐데 이 경우 아마 디폴트로 'public'스키마는
  사용자(role)을 생성시 기본으로 객체 권한이 부여되는듯 하다. 그러므로 해당 명령수행을 놓치걸로 판단된다.

+ Recent posts