콘텐츠로 이동

날짜시간 함수

날짜시간 함수#

이들 함수는 날짜 및 시간 입력 값에 대한 작업을 수행하여 문자, 숫자 또는 날짜/시간 타입의 값을 반환한다. 입력 인자의 값이 문자 데이터 타입이면, 그 값은 ALTIBASE_DATE_FORMAT 환경변수 또는 DEFAULT_DATE_FORMAT 프로퍼티 (앞의 것이 우선순위가 높음)에 설정된 형식을 따라야 한다. 또한, 이 형식은 iSQL 에서 이들 함수 수행시 반환되는 날짜/시간 값을 출력하는데 사용된다.

DATE 데이터 타입과 이 타입의 데이터 반환시 사용되는 날짜형 데이터 형식에 대한 자세한 설명은 General Reference를 참고하기 바란다.

ADD_MONTHS#

구문#

ADD_MONTHS (date, number)

설명#

이 함수는 datenumber개월을 더하여 그 결과를 반환한다. 인자 number는 정수이거나 정수로 변환이 가능한 값이면 된다. date의 날짜가 해당 월의 마지막 날짜인 경우에는 number 개월을 더한 달의 마지막 날짜를 반환한다.

예제#

<질의> 사원번호가 10인 사원의 입사일과 입사 6개월 후의 날짜를 출력하라.

SELECT join_date
     , ADD_MONTHS(join_date, 6)
  FROM employees
 WHERE eno = 10;
JOIN_DATE    ADD_MONTHS(JOIN_DATE, 6)
-----------------------------------------
05-JAN-2010  05-JUL-2010
1 row selected.

<질의> 사원번호가 20인 사원의 입사일과 입사 6개월 후의 날짜를 출력하라.

SELECT join_date
     , ADD_MONTHS(join_date, 6)
  FROM employees
 WHERE eno = 20;
JOIN_DATE    ADD_MONTHS(JOIN_DATE, 6)
-----------------------------------------
28-FEB-2010  31-AUG-2010
1 row selected.

CONV_TIMEZONE#

구문#

CONV_TIMEZONE(expr, src_tz, dest_tz)

설명#

이 함수는 src_tz 타임 존 기준의 exprdest_tz 타임 존 기준으로 변환한다. src_tzdest_tz에는 타임 존의 지역 이름이나 약어, 또는 UTC 오프셋 값을 입력할 수 있다.

예제#

<질의> UTC 오프셋 +00:00 기준의 현재 시각을 KST 타임 존 기준으로 변환하여 출력하고, SYSDATE 함수 출력과 비교한다. 데이터베이스 서버의 타임 존이 KST이므로, 결과가 같을 것이다.

SELECT TO_CHAR(CONV_TIMEZONE(UNIX_DATE, '+00:00', 'KST'), 'MM/DD HH:MI') kst_date
  FROM DUAL;
KST_DATE
--------------------------------------
06/12 17:27
1 row selected.
SELECT TO_CHAR(SYSDATE, 'MM/DD HH:MI')
  FROM DUAL;
TO_CHAR(SYSDATE, 'MM/DD HH:MI')
--------------------------------------
06/12 17:27
1 row selected.

CURRENT_DATE#

구문#

CURRENT_DATE

설명#

이 함수는 Altibase가 운영중인 시스템의 현재 날짜와 시간을 클라이언트 세션의 타임 존 기준으로 반환한다.

예제#

<질의> 시스템의 현재 날짜를 클라이언트 타임 존 기준으로 출력하라.

SELECT TO_CHAR(CURRENT_DATE,'YYYY MM/DD HH:MI') current_date
  FROM DUAL;
CURRENT_DATE
-----------------------------------------------------
2013 06/12 15:33
1 row selected.

CURRENT_TIMESTAMP#

구문#

CURRENT_TIMESTAMP

설명#

이 함수는 Altibase가 운영중인 시스템의 현재 날짜와 시간을 클라이언트 세션의 타임 존 기준으로 반환한다.

이 함수는 CURRENT_DATE 함수의 별칭(alias)이다.

예제#

<질의> 시스템의 현재 날짜를 클라이언트 타임 존 기준으로 출력하라.

SELECT TO_CHAR(CURRENT_TIMESTAMP,'YYYY MM/DD HH:MI') current_timestamp
  FROM DUAL;
CURRENT_TIMESTAMP
-----------------------------------------------------
2013 06/12 15:34
1 row selected.

TIMESTAMPADD#

구문#

TIMESTAMPADD (date_field_name, number, date)

설명#

이 함수는 datedate_field_name부분을 number 만큼 증가시켜 그 결과를 반환한다. number가 정수가 아닐 경우 소수점 이하 부분은 버린 후에 적용한다.

date_field_name이 'SECOND'일 경우에는 number는 68년(2144448000초) 이내의 값이어야 하고, 'MICROSECOND'일 경우에는 number는 30일(2592000000000마이크로초) 이내의 값이어야 한다.

TIMESTAMPADD 함수에 사용할 수 있는 date_field_name은 다음과 같으며 예제와 같이 'SQL_TSI_' 접두어를 붙여 사용할 수 도 있다.

Date Field Name 내용
SQL_TSI_YEAR 또는 YEAR date의 년도에 number 만큼을 더한다.
SQL_TSI_QUARTER 또는 QUARTER date의 월에 3*number 만큼을 더한다.
SQL_TSI_MONTH 또는 MONTH date의 월에 number 만큼을 더한다.
SQL_TSI_WEEK 또는 WEEK date의 일에 7*number 만큼을 더한다.
SQL_TSI_DAY 또는 DAY date의 일에 number 만큼을 더한다.
SQL_TSI_HOUR 또는 HOUR date의 시에 number 만큼을 더한다.
SQL_TSI_MINUTE 또는 MINUTE date의 분에 number 만큼을 더한다.
SQL_TSI_SECOND 또는 SECOND date의 초에 number 만큼을 더한다.
SQL_TSI_MICROSECOND 또는 MICROSECOND date의 마이크로 초에 number 만큼을 더한다.

예제#

ALTER SESSION SET DEFAULT_DATE_FORMAT = 'HH:MI:SS';

SELECT TIMESTAMPADD( SQL_TSI_SECOND, 1, TO_DATE('12:12:00', 'hh24:mi:ss') )
  FROM DUAL;
TIMESTAMPADD( SQL_TSI_SECOND, 1, TO_DATE('
---------------------------------------------
12:12:01
1 row selected.
SELECT TIMESTAMPADD( MINUTE, 1, TO_DATE('12:12:00', 'hh24:mi:ss') )
  FROM DUAL;
TIMESTAMPADD( MINUTE, 1, TO_DATE('12:12:00
---------------------------------------------
12:13:00
1 row selected.

DATEADD#

구문#

DATEADD (date, number, date_field_name)

설명#

이 함수는 datedate_field_name부분을 number 만큼 증가시켜 그 결과를 반환한다. number가 정수가 아닐 경우 소수점 이하 부분은 버린 후에 적용한다.

date_field_name이 'SECOND'일 경우에는 number는 68년 이내의 값이어야 하고, 'MICROSECOND'일 경우에는 number는 30일 이내의 값이어야 한다.

DATEADD 함수에 사용할 수 있는 date_field_name은 다음과 같다.

Date Field Name 내용
CENTURY date의 년도에 100*number 만큼을 더한다.
YEAR date의 년도에 number 만큼을 더한다.
QUARTER date의 월에 3*number 만큼을 더한다.
MONTH date의 월에 number 만큼을 더한다.
WEEK date의 일에 7*number 만큼을 더한다.
DAY date의 일에 number 만큼을 더한다.
HOUR date의 시에 number 만큼을 더한다.
MINUTE date의 분에 number 만큼을 더한다.
SECOND date의 초에 number 만큼을 더한다.
MICROSECOND date의 마이크로 초에 number 만큼을 더한다.

예제#

<질의> 입사한지 40일이 안 된 사원의 수를 구하라.

SELECT COUNT(*)
  FROM employees
 WHERE join_date > DATEADD (SYSDATE, -40, 'DAY');
COUNT
----------
5
1 row selected.

DATEDIFF#

구문#

DATEDIFF (startdate, enddate, date_field_name)

설명#

이 함수는 enddate에서 startdate를 뺀 값(즉, enddate - startdate)을 date_field_name에 명시한 단위로 반환한다. enddate보다 startdate의 값이 더 크면 음수가 반환된다.

이 함수는 enddatestartdate의 값을 date_field_name에 명시한 단위의 값으로 각각 구해서 빼는 것으로, DATEDIFF 함수의 결과값은 항상 정수이다.

DATEDIFF 함수에 사용 가능한 date_field_name은 다음과 같다.

  • CENTURY

  • YEAR

  • QUARTER

  • MONTH

  • WEEK

  • DAY

  • HOUR

  • MINUTE

  • SECOND

  • MICROSECOND

DATEDIFF 함수가 반환하는 값의 범위는 date_field_name의 값에 따라서 한정되어 있다. date_field_name이 'MICROSECOND'일 때는 enddate 에서 startdate을 뺀 값이 30일 이내여야 한다. 그리고 초를 나타내는 'SECOND'일 경우에 enddatestartdate의 차는 평년(365일)을 기준으로 68년이다. 이 범위를 초과하면 에러가 발생한다.

이 함수의 반환 데이터 타입은 BIGINT이다.

예제#

<질의> 2005년 8월 31일과 2005년 11월 30일 간의 개월 수의 차를 구하라.

SELECT DATEDIFF ('31-AUG-2005', '30-NOV-2005', 'MONTH')
  FROM DUAL;
DATEDIFF ('31-AUG-2005', '30-NOV-2005',  
-------------------------------------------
3                    
1 row selected.

DATENAME#

구문#

DATENAME (date, date_field_name)

설명#

이 함수는 입력 date_field_name에 따라서 지정한 date의 월 또는 요일의 이름을 반환한다.

다음 표는 DATENAME 함수에 사용 가능한 date_field_name을 보여준다.

Date Field Name 설명
MONTH, Month, month 월의 이름 (전체 이름)
MON, Mon, mon 월의 이름 (약자)
DAY, Day, day 요일의 이름 (전체 이름)
DY, Dy, dy 요일의 이름 (약자)

date_field_name별 가능한 출력 결과는 다음과 같다. date_field_name은 대문자, 소문자, 또는 첫문자만 대문자로 입력할 수 있고, 이 값에 일치하는 결과가 출력될 것이다.

  • MONTH
    JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER

  • MON
    JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC

  • DAY
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY

  • DY
    SUN, MON, TUE, WED, THU, FRI, SAT

예제#

<질의> 1980년 12월 28일의 월의 이름을 구하라.

SELECT DATENAME ('28-DEC-1980', 'Month') FROM DUAL;
DATENAME ('28-DEC-1980', 'Month')  
-------------------------------------
December    
1 row selected.

DB_TIMEZONE#

구문#

DB_TIMEZONE()

설명#

이 함수는 데이터베이스 서버에 설정된 타임 존을 반환한다. 반환 값은 타임 존의 지역 이름이나 약어, 또는 UTC 오프셋 형태이다.

예제#

<질의> 데이터베이스 서버에 설정되어 있는 타임 존을 출력하라.

SELECT DB_TIMEZONE() FROM DUAL;
DB_TIMEZONE
--------------------------------------------
+09:00
1 row selected.

DATEPART#

구문#

DATEPART (date, 'date_field_name')

설명#

date에서 date_field_name 에 해당하는 값만 반환한다.

Date Field Name 내용
CENTURY 세기 (예를 들어, 2011의 경우 21을 1999의 경우는 20을 반환)
YEAR
QUARTER 분기
MONTH
WEEK 일년 중 몇 번째 주인지 반환함. (그 해의 첫 번째 토요일과 그 앞의 날은 그 해의 첫 번째 주가 된다.)
WEEKOFMONTH 그 달의 몇 번째 주인지 반환함. (그 달의 첫 번째 토요일과 그 앞의 날은 그 달의 첫 번째 주가 된다.)
DAY
DAYOFYEAR 일년 중 몇 번째 날인지 반환함.
DAYOFWEEK 주의 몇 번째 날인지 반환함. (일요일 = 1)
HOUR
MINUTE
SECOND
MICROSECOND 마이크로 초

예제#

<질의> 사원번호가 10인 사원이 입사한 분기를 구하라.

SELECT DATEPART (join_date, 'QUARTER')
  FROM employees
 WHERE eno = 10;
DATEPART (JOIN_DATE, 'QUARTER')
----------------------------------
1
1 row selected.

EXTRACT#

구문#

EXTRACT (date, 'date_field_name')
EXTRACT (date_field_name2 FROM date)

설명#

date에서 date_field_name, date_field_name2 에 해당하는 값만 반환한다.

EXTRACT (date, 'date_field_name') 의 동작은 DATEPART와 동일하다.

그러나 EXTRACT(date_field_name2 FROM date) 구문은 EXTRACT만 지원하며, 추출할 수 있는 날짜필드는 YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 이다.

Date Field Name 내용
CENTURY 세기 (예를 들어, 2011의 경우 21을 1999의 경우는 20을 반환)
YEAR
QUARTER 분기
MONTH
WEEK 일년 중 몇 번째 주인지 반환함. (그 해의 첫 번째 토요일과 그 앞의 날은 그 해의 첫 번째 주가 된다.)
WEEKOFMONTH 그 달의 몇 번째 주인지 반환함. (그 달의 첫 번째 토요일과 그 앞의 날은 그 달의 첫 번째 주가 된다.)
DAY
DAYOFYEAR 일년 중 몇 번째 날인지 반환함.
DAYOFWEEK 주의 몇 번째 날인지 반환함. (일요일 = 1)
HOUR
MINUTE
SECOND
MICROSECOND 마이크로 초
Date Field Name2 내용
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND

예제#

<질의> 사원번호가 10인 사원이 입사한 년도를 구하라.

SELECT EXTRACT (join_date, 'YEAR')
  FROM employees
 WHERE eno = 10;
EXTRACT(JOIN_DATE,'YEAR')
----------------------------
2010
1 row selected.
SELECT EXTRACT (YEAR FROM join_date)
  FROM employees
 WHERE eno = 10;
EXTRACT(JOIN_DATE,'YEAR')
----------------------------
2010
1 row selected.

MONTHS_BETWEEN#

구문#

MONTHS_BETWEEN (date1, date2)

설명#

이 함수는 date1에서 date2를 뺀 값을 개월 수로 반환한다. date1date2보다 작다면 음수가 반환될 것이다.

date1date2가 같은 달의 같은 날이거나, 다른 달의 같은 날 또는 서로 다른 달의 마지막 날이라면 정수가 반환될 것이다. 이 경우에는 date1date2의 시간, 분, 초, 마이크로 초 부분은 무시된다.

다른 경우에는, 반환되는 값은 정수가 아닌 값이며, 이는 한 달을 31일로 간주하여 입력 날짜의 시간, 분, 초, 마이크로 초 부분을 변환해서 소수 부분이 계산된 것이다.

반환형은 DOUBLE이다.

예제#

<질의> 1995년 2월 2일에서 1995년 1월 1일을 뺀 값을 개월 수로 구하라.

SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM-DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) months
  FROM DUAL;
MONTHS                 
-------------------------
1.03225806451613      
1 row selected.

ROUND (date)#

구문#

ROUND (date [, date_field_name])

설명#

이 함수는 지정한 date_field_name의 단위에 맞춰서 date를 반올림한 날짜를 반환한다. date_field_name의 기본값은 'DAY'이다.

다음 표는 ROUND 함수에 사용 가능한 date_field_name을 보여준다.

Date Field Name 설명
CENTURY
SCC
CC
반올림한 세기의 첫번째 날을 반환함. xx51년 이상은 다음 세기로 올림. (단, 세기는 xxx1년부터 시작함)
YEAR
SYYYY
YYYY
YYY
YY
Y
7월 1일부터 다음 해로 올림.
QUARTER
Q
반올림한 분기의 첫번째 날을 반환함. 분기의 두 번째 달의 16일부터 다음 분기로 올림.
MONTH
MON
MM
RM
16일부터 다음 달로 올림.
WEEK
WW
목요일부터 다음 주 일요일로 올림.
DAY
DDD
DD
J
PM 12:00부터 다음 일로 올림.
HOUR
HH
HH12
HH24
30분부터 다음 시로 올림.
MINUTE
MI
30초부터 다음 분으로 올림.

예제#

<질의> 1980년 12월 27일을 YEAR로 반올림하여 출력하라.

SELECT ROUND ( TO_DATE('27-DEC-1980', 'DD-MON-YYYY'), 'YEAR')
  FROM DUAL;
ROUND ( TO_DATE('27-DEC-1980', 'DD-MON-Y
-------------------------------------------
1981/01/01 00:00:00
1 row selected.

LAST_DAY#

구문#

LAST_DAY (date)

설명#

이 함수는 date을 포함하는 달의 마지막 일을 반환한다. 반환 타입은 항상 DATE이다.

예제#

<질의> 12월의 마지막 일을 출력하라.

SELECT LAST_DAY(TO_DATE('15-DEC-2001')) FROM DUAL;
LAST_DAY(TO_DATE('15-DEC-2001')) 
-----------------------------------
2001/12/31 00:00:00  
1 row selected.

<질의> 사원들이 입사한 달의 마지막 일을 출력하라.

SELECT LAST_DAY(join_date ) FROM employees;
LAST_DAY(JOIN_DATE ) 
-----------------------

1999/11/30 00:00:00  
2000/01/31 00:00:00
.
.
. 
20 rows selected.

NEXT_DAY#

구문#

NEXT_DAY (date, weekday)

설명#

이 함수는 입력된 날짜(date) 이후에 첫번째로 오는 weekday 로 명시한 요일의 날짜를 반환한다. date의 요일이 weekday와 같다면, 다음 주 같은 요일의 날짜가 반환된다.

weekday 인자는 요일 중 하나이어야 한다. 대소문자는 구별하지 않고 요일의 전체 이름 또는 약어로 지정 가능하다.

예제#

<질의> 각 사원들의 입사일과 입사일 후 첫번째 일요일을 출력하라.

SELECT join_date
     , NEXT_DAY(join_date, 'SUNDAY') first_sunday
  FROM employees;
JOIN_DATE            FIRST_SUNDAY         
---------------------------------------------
.
.
.
24-JAN-2004  25-JAN-2004
29-NOV-2009  06-DEC-2009
14-JUN-2010  20-JUN-2010
05-JAN-2010  10-JAN-2010
.
.
.
20 rows selected.

SESSION_TIMEZONE#

구문#

SESSION_TIMEZONE()

설명#

이 함수는 데이터베이스 세션에 설정된 타임 존을 반환한다. 반환 값은 타임 존의 지역 이름, 약어, 또는 UTC 오프셋 형태이다.

예제#

<질의> 데이터베이스 세션에 설정되어 있는 타임 존을 출력하라.

SELECT SESSION_TIMEZONE() FROM DUAL;
SESSION_TIMEZONE                               
--------------------------------------------
+09:00                                    
1 row selected.

SYSDATE#

구문#

SYSDATE

설명#

이 함수는 Altibase가 운영중인 시스템의 현재 날짜와 시간을 출력한다.

예제#

<질의> 시스템 날짜(현재 날짜)를 출력하라.

SELECT SYSDATE system_date FROM DUAL;
SYSTEM_DATE          
-----------------------
2005/01/20 09:49:33  
1 row selected.

SYSTIMESTAMP#

구문#

SYSTIMESTAMP

설명#

이 함수는 Altibase가 운영중인 시스템의 현재 날짜와 시간을 출력한다. 이 함수는 SYSDATE 함수의 alias이며 시간대(time zone)은 지원하지 않는다.

예제#

<질의> 시스템 날짜(현재 날짜)를 출력하라.

SELECT SYSTIMESTAMP FROM DUAL;
SYSTIMESTAMP
-----------------------
2005/01/20 09:49:33  
1 row selected.

SYSDATETIME#

구문#

SYSDATETIME

설명#

이 함수는 Altibase가 운영중인 시스템의 현재 날짜와 시간을 출력한다. 이 함수는 SYSDATE 함수의 alias이며 시간대(time zone)은 지원하지 않는다.

예제#

<질의> 시스템 날짜(현재 날짜)를 출력하라.

SELECT SYSDATETIME FROM DUAL;
SYSDATETIME  
---------------
2005/01/20 09:49:33  
1 row selected.

TRUNC (date)#

구문#

TRUNC (date [, 'fmt'])

설명#

버림 함수이다.

이 함수는 fmt에 명시된 단위까지만 반환한다. 즉, fmt로 명시된 단위보다 낮은 단위에 해당하는 모든 부분은0으로 교체된다.

fmt를 생략하면 시간 단위 이하 부분은 제거되고 날짜까지만 반환된다.

TRUNC 함수에 사용할 수 있는 단위는 ROUND에서 지원하는 단위 외에 아래의 단위도 지원한다. ROUND에서 지원하는 단위는 ROUND 함수에서 제공하는 표를 참조한다.

  • SECOND

  • MICROSECOND

예제#

<질의> 다음 예는 시스템 시간의 시간을 버림한 결과를 돌려준다.

SELECT TRUNC(SYSDATE) FROM DUAL;    
TRUNC(SYSDATE)       
-----------------------
2005/07/19 00:00:00  
1 row selected.

<질의> 다음 예는 날짜를 버림한 결과를 돌려준다.

SELECT TRUNC(TO_DATE('2005-JUL-19','YYYY-MON-DD'), 'YEAR') new_year
  FROM DUAL;
NEW_YEAR             
-----------------------
2005/01/01 00:00:00  
1 row selected.

UNIX_DATE#

구문#

UNIX_DATE

설명#

이 함수는 Altibase가 운영중인 시스템의 현재 날짜와 시간을 UTC +00:00 타임 존 기준으로 출력한다.

예제#

<질의> 시스템의 현재 날짜를 출력하라.

SELECT TO_CHAR(UNIX_DATE,'YYYY MM/DD HH:MI') unix_date
  FROM DUAL;
UNIX_DATE
-----------------------------------------------------------
2013 06/12 06:32
1 row selected.

UNIX_TIMESTAMP#

구문#

UNIX_TIMESTAMP

설명#

이 함수는 Altibase가 운영중인 시스템의 현재 날짜와 시간을 UTC +00:00 타임 존 기준으로 출력한다.

이 함수는 UNIX_DATE 함수의 별칭(alias)이다.

예제#

<질의> 시스템의 현재 날짜를 출력하라.

SELECT TO_CHAR(UNIX_TIMESTAMP,'YYYY MM/DD HH:MI') unix_timestamp
  FROM DUAL;
UNIX_TIMESTAMP
-----------------------------------------------------
2013 06/12 06:33
1 row selected.