http://www.mysqlkorea.co.kr
한글매뉴얼 5.0 , 한글매뉴얼 5.1 , MySQL 5.1 HA , 사용자매뉴얼
한글매뉴얼 5.0  
한글매뉴얼 5.1  
MYSQL 5.1 HA  
사용자매뉴얼  
영문매뉴얼  
최신글
mysql my파일과 …
mysql server 설…
Can't open and l…
듀얼마스터 구성 …
PREPARE 사용시 …
 
한글매뉴얼 5.0 > 매뉴얼존 > 한글매뉴얼 5.0
 

12.5. 날짜 및 시간 함수(1)

 

이 섹션에서는 임시 값 (temporal value)을 처리하는 함수에 대해서 설명을 하기로 하겠다.

아래의 명령문은 날짜 함수 사용에 대한 예문이다. 예문에 나와 있는 쿼리는 최근 30일 동안에 date_col 값을 가지고 있는 모든 열을 선택하는 것이다:

 

mysql> SELECT something FROM tbl_name

    -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

 

날짜 값을 기대하는 함수는 일반적으로 데이트타임(datetime)을 수용하지만 시간 부분은 무시 한다. 반면에, 타임 값을 기대하는 함수는 일반적으로 데이트 타임 값을 수용하지만 날짜 부분은 무시를 한다.

 

현재 날짜 또는 시간을 각각 리턴하는 함수는 쿼리가 실행되는 시작 시점에서 쿼리 당 한번씩만 계산을 한다. 이것은, 하나의 쿼리안에 있는 NOW()와 같은 함수를 여러 번 참조하더라도 항상 같은 값이 나온다는 것을 의미하는 것이다. 이러한 방식은 CURDATE(), CURTIME(), UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP(), 그리고 이 함수들과 동일한 기능을 하는 함수들에도 적용이 된다.

 

CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE(), 그리고 FROM_UNIXTIME() 함수는 연결이 된 현재 (current)의 타임 존에 있는 값을 리턴하는데, 이것은 time_zone 시스템 변수의 값으로 사용 가능하다. 또한, UNIX_TIMESTAMP()는 자신의 인수가 현재의 타임 존에 있는 데이트타임 값이라고 가정을 한다. Section 5.11.8, “MySQL 서버 타임 지원을 참조할 것.

 

몇몇 날짜 함수는 제로 (zero)” 날짜 또는 '2001-11-00'와 같이 완전하지 않은 형태의 날짜를 수용한다. 날짜 부분을 추출하는 함수는 전형적으로 이러한 값들을 수용한다. 예를 들면:

 

mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');

        -> 0, 0

 

이외의 함수들은 완전한 형태의 날짜를 사용하며, 완전하지 않은 형태에 대해서는 NULL을 리턴한다. 날짜를 수학적으로 계산하거나 또는 날짜 부분을 이름과 매핑시키는 함수들이 여기에 해당한다. 예를 들면:

 

mysql> SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);

        -> NULL

mysql> SELECT DAYNAME('2006-05-00');

        -> NULL

 

ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)

 

두 번째 인수에 INTERVAL 폼을 사용해서 호출을 하게 되면, ADDDATE()DATE_ADD()과 동일한 값을 리턴한다. 이 함수와 관련을 갖는 SUBDATE() 함수는 DATE_SUB()과 동일한 것이다. INTERVAL unit 인수에 대한 정보는 DATE_ADD() 함수 설명을 참조하기 바란다.

 

mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);

        -> '1998-02-02'

mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);

        -> '1998-02-02'

 

두 번째 인수를 days 폼으로 호출하면, MySQL은 이것을 expr에 추가되어야 하는 날짜 일수로 처리를 한다.

 

mysql> SELECT ADDDATE('1998-01-02', 31);

        -> '1998-02-02' 

  • ADDTIME(expr1,expr2)

ADDTIME()expr2 expr1 에 추가한 다음에 그 결과를 리턴 한다. expr1 는 타임 또는 데이트 타임 수식이며, expr2 는 타임 수식이다.

 

mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999',

    ->                '1 1:1:1.000002');

        -> '1998-01-02 01:01:01.000001'

mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');

        -> '03:00:01.999997'

  • CONVERT_TZ(dt,from_tz,to_tz)

CONVERT_TZ()from_tz에 의해 주어진 타임 존의 데이트 타임 값 dtto_tz에 의해 주어지는 타임 존으로 변환을 시키고 그 결과 스트링을 리턴한다. 타임 존에 대해서는 Section 5.11.8, “MySQL 서버 타임 지원을 참조하기 바란다. 이 함수는 인수가 올바르지 않을 경우에는 NULL을 리턴한다.

만일 그 값이 from_tz에서 UTC로 변환이 될 때 TIMESTAMP 타임의 지원 범위를 벗어 나게 되는 경우에는, 아무런 변환도 일어나지 않는다. TIMESTAMP 범위는 Section 11.1.2, “날짜 시간 타입 개요를 참조하기 바란다.

 

mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');

        -> '2004-01-01 13:00:00'

mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');

        -> '2004-01-01 22:00:00'

 

Note: 'MET' 또는 'Europe/Moscow'와 같은 네임드 타임 존을 사용하기 위해서는, 그 타임 존 테이블은 반드시 올바르게 설정이 되어 있어야 한다. Section 5.11.8, “MySQL 서버 타임 지원을 참조할 것.

만일 다른 테이블들이 LOCK TABLES과 함께 잠겨 있는 동안에 CONVERT_TZ() 함수를 사용하고자 한다면, 여러분은 반드시 mysql.time_zone_name 테이블도 잠가 두어야 한다.

  • CURDATE()

이 함수가 스트링 또는 숫자 문장 안에서 사용되는 것에 따라서, 현재의 날짜를 'YYYY-MM-DD' 또는 YYYYMMDD 포맷 형태의 값으로 리턴한다.

 

mysql> SELECT CURDATE();

        -> '1997-12-15'

mysql> SELECT CURDATE() + 0;

        -> 19971215 

  • CURRENT_DATE, CURRENT_DATE()

CURRENT_DATE CURRENT_DATE()CURDATE()과 동일한 함수이다.

  • CURTIME()

이 함수가 스트링 또는 숫자 문장 안에서 사용되는 것에 따라서, 현재 시간을 'HH:MM:SS' 또는 HHMMSS 포맷 형태로 리턴한다.

 

mysql> SELECT CURTIME();

        -> '23:50:26'

mysql> SELECT CURTIME() + 0;

        -> 235026

  • CURRENT_TIME, CURRENT_TIME()

CURRENT_TIME CURRENT_TIME()CURTIME()와 동일한 함수이다.

  • CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()

CURRENT_TIMESTAMP CURRENT_TIMESTAMP()NOW()과 동일한 함수이다.

  • DATE(expr)

날짜 또는 데이트 타임 수식 expr에서 날짜 부분을 추출한다.

 

mysql> SELECT DATE('2003-12-31 01:02:03');

        -> '2003-12-31'

  • DATEDIFF(expr1,expr2)

DATEDIFF()는 두 날짜 간의 차이를 expr1expr2 수식의 결과 값으로 리턴한다. expr1 expr2는 날짜 또는 날짜--시간 수식이 될 수 있다. 이 함수에서는 오직 날짜 값만이 계산에서 사용된다.

 

mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');

        -> 1

mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');

        -> -31

  • DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)

이 함수들은 날짜 산술식 (date arithmetic)을 실행한다. date는 시작 날짜를 지정하는 DATETIME 또는 DATE 값이다. expr는 시작 날짜에서 더해지거나 빼지는 간격 값 (interval value)를 나타내는 수식이다. expr 는 스트링이다; 이것은 음수 기호-를 사용할 수도 있다. unit 는 수식이 해석되어야 하는 유닛을 가리키는 키워드이다.

INTERVAL 키워드 및 unit 는 문자 크기를 구분하지 않는다.

아래의 테이블은 각각의 unit 값에 대한 expr 인수의 예상 형태를 보여주는 것이다 

 

unit Value

Expected expr Format

MICROSECOND

MICROSECONDS

SECOND

SECONDS

MINUTE

MINUTES

HOUR

HOURS

DAY

DAYS

WEEK

WEEKS

MONTH

MONTHS

QUARTER

QUARTERS

YEAR

YEARS

SECOND_MICROSECOND

'SECONDS.MICROSECONDS'

MINUTE_MICROSECOND

'MINUTES.MICROSECONDS'

MINUTE_SECOND

'MINUTES:SECONDS'

HOUR_MICROSECOND

'HOURS.MICROSECONDS'

HOUR_SECOND

'HOURS:MINUTES:SECONDS'

HOUR_MINUTE

'HOURS:MINUTES'

DAY_MICROSECOND

'DAYS.MICROSECONDS'

DAY_SECOND

'DAYS HOURS:MINUTES:SECONDS'

DAY_MINUTE

'DAYS HOURS:MINUTES'

DAY_HOUR

'DAYS HOURS'

YEAR_MONTH

'YEARS-MONTHS'

 
 

QUARTER WEEKMySQL 5.0.0에서부터 사용 가능해 졌다.

MySQLexpr 포맷 안에서 모든 구두점 구분자를 사용하는 것을 허용한다. 위의 테이블에 나와 있는 것들은 제안 형식이다. 만일 date 인수가 DATE 값이고 여러분이 사용하는 계산식이 YEAR, MONTH만을 포함하고 있으며, 그리고 DAY 부분 (, 타임 부분이 없음)만을 사용한다면, 그 결과는 DATE 값이 된다. 그렇지 않을 경우에는, 그 결과는 DATETIME 값이 된다.

날짜 계산식은 또한 INTERVAL+ 또는 연산자와 함께 사용할 수도 있다:

 

date + INTERVAL expr unit

date - INTERVAL expr unit

 

INTERVAL expr unit , 다른 쪽에 있는 수식이 날짜 또는 데이트 타임 값일 경우에는 + 연산자를 중심으로 어느쪽에도 올 수가 있다. 연산자의 경우, INTERVAL expr unit는 오른쪽 부분에만 나올 수가 있는데, 그 이유는 인터벌에서 데이트 타임 또는 날짜를 뺀다는 것이 의미가 없기 때문이다.

 

mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;

        -> '1998-01-01 00:00:00'

mysql> SELECT INTERVAL 1 DAY + '1997-12-31';

        -> '1998-01-01'

mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;

        -> '1997-12-31 23:59:59'

mysql> SELECT DATE_ADD('1997-12-31 23:59:59',

    ->                 INTERVAL 1 SECOND);

        -> '1998-01-01 00:00:00'

mysql> SELECT DATE_ADD('1997-12-31 23:59:59',

    ->                 INTERVAL 1 DAY);

        -> '1998-01-01 23:59:59'

mysql> SELECT DATE_ADD('1997-12-31 23:59:59',

    ->                 INTERVAL '1:1' MINUTE_SECOND);

        -> '1998-01-01 00:01:00'

mysql> SELECT DATE_SUB('1998-01-01 00:00:00',

    ->                 INTERVAL '1 1:1:1' DAY_SECOND);

        -> '1997-12-30 22:58:59'

mysql> SELECT DATE_ADD('1998-01-01 00:00:00',

    ->                 INTERVAL '-1 10' DAY_HOUR);

        -> '1997-12-30 14:00:00'

mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);

        -> '1997-12-02'

mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',

    ->            INTERVAL '1.999999' SECOND_MICROSECOND);

        -> '1993-01-01 00:00:01.000001'

 

만일 너무 짧은 인터벌 값을 지정한다면, MySQL은 여러분이 인터벌 값의 맨 왼쪽 부분을 생략했다고 가정을 한다. 예를 들면, 만일 여러분이 DAY_SECONDunit 부분을 지정한다면, expr 의 값은 날짜, 시간, , 그리고 초 부분을 가져야 한다고 가정을 한다. 만일 어떤 값을 '1:10'처럼 지정할 경우에는, MySQL은 날짜 및 시간 (hour) 부분이 누락이 되고 분과 초만 표시되었다고 가정을 한다. 달리 표현하면, '1:10' DAY_SECOND'1:10' MINUTE_SECOND로 해석이 된다. 이것은 MySQL TIME 값을 일별 시간이 아닌 경과 시간으로 표현한 것으로 해석하는 것과 같은 방식이다.

만일 시간 부분이 있는 특정 날짜 값에서 날짜를 더하거나 빼게 되는 경우, 그 결과는 자동적으로 데이트타임 값으로 변환된다:

 

mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);

        -> '1999-01-02'

mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);

        -> '1999-01-01 01:00:00'

 

만일 여러분이 MONTH, YEAR_MONTH를 더하거나, 또는 YEAR 및 결과 날짜가 새로운 달의 최대 일수보다 크게 된다면, 그 결과 날짜는 새로운 달의 최대 날짜로 정렬이 된다:

 

mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);

        -> '1998-02-28'

 

날짜 산술식 연산은 완벽한 날짜 형태를 요구하며 '2006-07-00'와 같은 완전하지 못한 형태를 가지고는 동작을 하지 않는다:

 

mysql> SELECT DATE_ADD('2006-07-00', INTERVAL 1 DAY);

        -> NULL

mysql> SELECT '2005-03-32' + INTERVAL 1 MONTH;

        -> NULL

 

상위
12.5. 날짜 및 시간 함수(1…
12.5. 날짜 및 시간 함수(2…
MySQL Korea 사이트의 컨텐츠 소유권은 (주)상상이비즈에 있으므로 무단전재를 금합니다.
ⓒ 2010-2011 ssebiz All Rights Reserved.