날짜시간 함수
날짜시간 함수#
이들 함수는 날짜 및 시간 입력 값에 대한 작업을 수행하여 문자, 숫자 또는 날짜/시간 타입의 값을 반환한다. 입력 인자의 값이 문자 데이터 타입이면, 그 값은 ALTIBASE_DATE_FORMAT 환경변수 또는 DEFAULT_DATE_FORMAT 프로퍼티 (앞의 것이 우선순위가 높음)에 설정된 형식을 따라야 한다. 또한, 이 형식은 iSQL 에서 이들 함수 수행시 반환되는 날짜/시간 값을 출력하는데 사용된다.
DATE 데이터 타입과 이 타입의 데이터 반환시 사용되는 날짜형 데이터 형식에 대한 자세한 설명은 General Reference를 참고하기 바란다.
ADD_MONTHS#
구문#
ADD_MONTHS (date, number)
설명#
이 함수는 date에 number개월을 더하여 그 결과를 반환한다. 인자 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 타임 존 기준의 expr을 dest_tz 타임 존 기준으로 변환한다. src_tz와 dest_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)
설명#
이 함수는 date의 date_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)
설명#
이 함수는 date의 date_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의 값이 더 크면 음수가 반환된다.
이 함수는 enddate와 startdate의 값을 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'일 경우에 enddate 와 startdate의 차는 평년(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를 뺀 값을 개월 수로 반환한다. date1이 date2보다 작다면 음수가 반환될 것이다.
date1과 date2가 같은 달의 같은 날이거나, 다른 달의 같은 날 또는 서로 다른 달의 마지막 날이라면 정수가 반환될 것이다. 이 경우에는 date1과 date2의 시간, 분, 초, 마이크로 초 부분은 무시된다.
다른 경우에는, 반환되는 값은 정수가 아닌 값이며, 이는 한 달을 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.