Loading...
MySQL 9.5 Reference Manual 9.5의 11.1.3 Date and Time Literals의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Date와 time 값은 값의 정확한 타입 및 기타 요소에 따라, 작은따옴표로 둘러싼 문자열이나 숫자 등 여러 형식으로 표현될 수 있습니다. 예를 들어, MySQL이 date를 기대하는 컨텍스트에서는 '2015-07-21', '20150721', 20150721 모두를 date로 해석합니다.
이 절에서는 date 및 time 리터럴에 대해 허용되는 형식을 설명합니다. 시계열 데이터 타입(허용 값 범위 등)에 대한 더 많은 정보는 Section 13.2, “Date and Time Data Types”를 참조하십시오.
표준 SQL에서는 시계열 리터럴을 타입 키워드와 문자열을 사용하여 지정해야 합니다. 키워드와 문자열 사이의 공백은 선택 사항입니다.
1DATE 'str' 2TIME 'str' 3TIMESTAMP 'str'
MySQL은 타입 키워드를 인식하지만, 표준 SQL과 달리 이를 필수로 요구하지는 않습니다. 표준을 준수해야 하는 애플리케이션은 시계열 리터럴에 대해 타입 키워드를 포함해야 합니다.
MySQL은 표준 SQL 문법에 대응하는 ODBC 문법도 인식합니다:
1{ d 'str' } 2{ t 'str' } 3{ ts 'str' }
MySQL은 타입 키워드와 ODBC 구문을 사용하여 각각 DATE, TIME, DATETIME 값을 생성하며, 지정된 경우 뒤에 오는 소수 부분 초(fractional seconds) 부분도 포함합니다. TIMESTAMP 문법은 MySQL에서 DATETIME 값을 생성하는데, 이는 DATETIME의 범위가 표준 SQL TIMESTAMP 타입(연도 범위 00019999)과 더 가깝기 때문입니다. (MySQL TIMESTAMP의 연도 범위는 19702038입니다.)
MySQL은 DATE 값을 다음 형식으로 인식합니다:
'YYYY-MM-DD' 또는 'YY-MM-DD' 형식의 문자열. “완화된(relaxed)” 문법이 허용되지만, 이는 더 이상 사용이 권장되지 않습니다(deprecated). 어떤 구두점 문자든 date 부분 사이의 구분자로 사용할 수 있습니다. 예를 들어, '2012-12-31', '2012/12/31', '2012^12^31', '2012@12@31'은 동일합니다. 구분자로 대시(-)가 아닌 문자를 사용하면 아래와 같이 경고가 발생합니다:1mysql> SELECT DATE'2012@12@31'; 2+------------------+ 3| DATE'2012@12@31' | 4+------------------+ 5| 2012-12-31 | 6+------------------+ 71 row in set, 1 warning (0.00 sec) 8 9mysql> SHOW WARNINGS\G 10*************************** 1. row *************************** 11 Level: Warning 12 Code: 4095 13Message: Delimiter '@' in position 4 in datetime value '2012@12@31' at row 1 is 14deprecated. Prefer the standard '-'. 151 row in set (0.00 sec)
구분자가 없는 문자열으로, 'YYYYMMDD' 또는 'YYMMDD' 형식이며, 문자열이 date로서 의미가 있는 경우. 예를 들어, '20070523'과 '070523'은 '2007-05-23'으로 해석되지만, '071332'는(월과 일이 말이 되지 않으므로) 허용되지 않으며 '0000-00-00'이 됩니다.
숫자로, YYYYMMDD 또는 YYMMDD 형식이며, 숫자가 date로서 의미가 있는 경우. 예를 들어, 19830905와 830905는 '1983-09-05'으로 해석됩니다.
MySQL은 DATETIME 및 TIMESTAMP 값을 다음 형식으로 인식합니다:
'YYYY-MM-DD hh:mm:ss' 또는 'YY-MM-DD hh:mm:ss' 형식의 문자열. MySQL은 여기서도 “완화된(relaxed)” 문법을 허용하지만, 이는 더 이상 사용이 권장되지 않습니다. 어떤 구두점 문자든 date 부분 또는 time 부분 사이의 구분자로 사용할 수 있습니다. 예를 들어, '2012-12-31 11:30:45', '2012^12^31 11+30+45', '2012/12/31 11*30*45', '2012@12@31 11^30^45'는 동일합니다. 이와 같은 값에서 date 부분의 구분자로 대시(-), time 부분의 구분자로 콜론(:) 이외의 문자를 사용하면, 아래와 같이 경고가 발생합니다:1mysql> SELECT TIMESTAMP'2012^12^31 11*30*45'; 2+--------------------------------+ 3| TIMESTAMP'2012^12^31 11*30*45' | 4+--------------------------------+ 5| 2012-12-31 11:30:45 | 6+--------------------------------+ 71 row in set, 1 warning (0.00 sec) 8 9mysql> SHOW WARNINGS\G 10*************************** 1. row *************************** 11 Level: Warning 12 Code: 4095 13Message: Delimiter '^' in position 4 in datetime value '2012^12^31 11*30*45' at 14row 1 is deprecated. Prefer the standard '-'. 151 row in set (0.00 sec)
Date와 time 부분, 그리고 소수 부분 초 사이에서 인식되는 유일한 구분자는 소수점입니다.
Date와 time 부분은 공백 대신 T로 구분될 수 있습니다. 예를 들어, '2012-12-31 11:30:45'와 '2012-12-31T11:30:45'는 동일합니다.
이전에는 MySQL이 date 및 time 값에서, 그리고 DATETIME 및 TIMESTAMP 값의 date와 time 부분 사이에서, 앞뒤에 임의 개수의 공백 문자(whitespace)를 허용했습니다. MySQL 9.5에서는 이 동작이 더 이상 사용이 권장되지 않으며(deprecated), 과도한 공백 문자가 존재하면 아래와 같이 경고가 발생합니다:
1mysql> SELECT TIMESTAMP'2012-12-31 11-30-45'; 2+----------------------------------+ 3| TIMESTAMP'2012-12-31 11-30-45' | 4+----------------------------------+ 5| 2012-12-31 11:30:45 | 6+----------------------------------+ 71 row in set, 1 warning (0.00 sec) 8 9mysql> SHOW WARNINGS\G 10*************************** 1. row *************************** 11 Level: Warning 12 Code: 4096 13Message: Delimiter ' ' in position 11 in datetime value '2012-12-31 11-30-45' 14at row 1 is superfluous and is deprecated. Please remove. 151 row in set (0.00 sec)
Space 문자가 아닌 다른 공백 문자가 사용된 경우에도 경고가 발생합니다:
1mysql> SELECT TIMESTAMP'2021-06-06 2 '> 11:15:25'; 3+--------------------------------+ 4| TIMESTAMP'2021-06-06 511:15:25' | 6+--------------------------------+ 7| 2021-06-06 11:15:25 | 8+--------------------------------+ 91 row in set, 1 warning (0.00 sec) 10 11mysql> SHOW WARNINGS\G 12*************************** 1. row *************************** 13 Level: Warning 14 Code: 4095 15Message: Delimiter '\n' in position 10 in datetime value '2021-06-06 1611:15:25' at row 1 is deprecated. Prefer the standard ' '. 171 row in set (0.00 sec)
구분자, 공백 또는 둘 다에 대해 여러 문제가 존재하더라도, 시계열 값 하나당 경고는 하나만 발생합니다. 이는 다음 일련의 문에서와 같습니다:
1mysql> SELECT TIMESTAMP'2012!-12-31 11:30:45'; 2+----------------------------------+ 3| TIMESTAMP'2012!-12-31 11:30:45' | 4+----------------------------------+ 5| 2012-12-31 11:30:45 | 6+----------------------------------+ 71 row in set, 1 warning (0.00 sec) 8 9mysql> SHOW WARNINGS\G 10*************************** 1. row *************************** 11 Level: Warning 12 Code: 4095 13Message: Delimiter '!' in position 4 in datetime value '2012!-12-31 11:30:45' 14at row 1 is deprecated. Prefer the standard '-'. 151 row in set (0.00 sec) 16 17mysql> SELECT TIMESTAMP'2012-12-31 11:30:45'; 18+---------------------------------+ 19| TIMESTAMP'2012-12-31 11:30:45' | 20+---------------------------------+ 21| 2012-12-31 11:30:45 | 22+---------------------------------+ 231 row in set, 1 warning (0.00 sec) 24 25mysql> SHOW WARNINGS\G 26*************************** 1. row *************************** 27 Level: Warning 28 Code: 4096 29Message: Delimiter ' ' in position 11 in datetime value '2012-12-31 11:30:45' 30at row 1 is superfluous and is deprecated. Please remove. 311 row in set (0.00 sec) 32 33mysql> SELECT TIMESTAMP'2012-12-31 11:30:45'; 34+--------------------------------+ 35| TIMESTAMP'2012-12-31 11:30:45' | 36+--------------------------------+ 37| 2012-12-31 11:30:45 | 38+--------------------------------+ 391 row in set (0.00 sec)
구분자가 없는 문자열으로, 'YYYYMMDDhhmmss' 또는 'YYMMDDhhmmss' 형식이며, 문자열이 date로서 의미가 있는 경우. 예를 들어, '20070523091528'과 '070523091528'은 '2007-05-23 09:15:28'로 해석되지만, '071122129015'는(분 부분이 말이 되지 않으므로) 허용되지 않으며 '0000-00-00 00:00:00'이 됩니다.
숫자로, YYYYMMDDhhmmss 또는 YYMMDDhhmmss 형식이며, 숫자가 date로서 의미가 있는 경우. 예를 들어, 19830905132800과 830905132800은 '1983-09-05 13:28:00'으로 해석됩니다.
DATETIME 또는 TIMESTAMP 값에는 최대 마이크로초(6자리) 정밀도의 끝부분 소수 초(trailing fractional seconds) 부분을 포함할 수 있습니다. 소수 부분은 항상 나머지 time과 소수점으로 구분해야 하며, 다른 소수 초 구분자는 인식되지 않습니다. MySQL에서 소수 초 지원에 대한 정보는 Section 13.2.6, “Fractional Seconds in Time Values”를 참조하십시오.
두 자리 수 연도가 포함된 date는 세기를 알 수 없기 때문에 모호합니다. MySQL은 두 자리 수 연도를 다음 규칙으로 해석합니다:
70-99 범위의 year 값은 1970-1999가 됩니다.
00-69 범위의 year 값은 2000-2069가 됩니다.
Section 13.2.9, “2-Digit Years in Dates”도 참조하십시오.
Date 부분 구분자가 포함된 문자열로 값을 지정할 때, 10 미만인 month나 day 값에 대해 두 자리를 지정할 필요는 없습니다. '2015-6-9'는 '2015-06-09'와 같습니다. 마찬가지로, time 부분 구분자가 포함된 문자열로 값을 지정할 때, 10 미만인 hour, minute, second 값에 대해 두 자리를 지정할 필요는 없습니다. '2015-10-30 1:2:3'은 '2015-10-30 01:02:03'와 같습니다.
숫자로 지정된 값은 길이가 6, 8, 12 또는 14자리여야 합니다. 숫자가 8 또는 14자리인 경우 YYYYMMDD 또는 YYYYMMDDhhmmss 형식으로 간주되며, 처음 4자리가 year를 나타낸다고 가정합니다. 숫자가 6 또는 12자리인 경우 YYMMDD 또는 YYMMDDhhmmss 형식으로 간주되며, 처음 2자리가 year를 나타낸다고 가정합니다. 이 길이 중 하나가 아닌 숫자는 가장 가까운 길이가 되도록 앞쪽에 0을 채운 것처럼 해석됩니다.
구분자가 없는 문자열로 지정된 값은 길이에 따라 해석됩니다. 길이가 8 또는 14자인 문자열의 경우, 처음 4자가 year를 나타낸다고 가정합니다. 그렇지 않으면 처음 2자가 year를 나타낸다고 가정합니다. 이 문자열은 왼쪽에서 오른쪽으로 읽으며, 포함된 부분 수만큼 year, month, day, hour, minute, second 값을 찾습니다. 이는 6자 미만의 문자열을 사용해서는 안 된다는 뜻입니다. 예를 들어, '9903'을 1999년 3월을 나타내는 것으로 생각하고 지정하면, MySQL은 이를 “zero” date 값으로 변환합니다. 이는 year와 month 값이 99와 03이지만 day 부분이 완전히 빠져 있기 때문입니다. 그러나 month나 day 부분이 누락되었음을 나타내기 위해 0 값을 명시적으로 지정할 수는 있습니다. 예를 들어, '1999-03-00' 값을 삽입하려면 '990300'을 사용하십시오.
MySQL은 TIME 값을 다음 형식으로 인식합니다:
'D hh:mm:ss' 형식의 문자열. 다음과 같은 “완화된(relaxed)” 문법도 사용할 수 있습니다:
'hh:mm:ss', 'hh:mm', 'D hh:mm', 'D hh', 'ss'. 여기서 _D_는 day를 나타내며, 0에서 34까지의 값을 가질 수 있습니다.
구분자가 없는 'hhmmss' 형식의 문자열로, time으로서 의미가 있는 경우. 예를 들어, '101112'는 '10:11:12'로 이해되지만, '109712'는(분 부분이 말이 되지 않으므로) 허용되지 않으며 '00:00:00'이 됩니다.
hhmmss 형식의 숫자로, time으로서 의미가 있는 경우. 예를 들어, 101112는 '10:11:12'로 이해됩니다. 다음과 같은 대체 형식도 인식됩니다: ss, mmss, hhmmss.
끝부분 소수 초(trailing fractional seconds) 부분은 'D hh:mm:ss.fraction', 'hh:mm:ss.fraction', 'hhmmss.fraction', hhmmss.fraction 형식의 time에서 인식되며, 여기서 fraction은 최대 마이크로초(6자리) 정밀도의 소수 부분입니다. 소수 부분은 항상 나머지 time과 소수점으로 구분해야 하며, 다른 소수 초 구분자는 인식되지 않습니다. MySQL에서 소수 초 지원에 대한 정보는 Section 13.2.6, “Fractional Seconds in Time Values”를 참조하십시오.
Time 부분 구분자가 포함된 문자열로 지정된 TIME 값의 경우, 10 미만인 hour, minute, second 값에 대해 두 자리를 지정할 필요가 없습니다. '8:3:2'는 '08:03:02'와 같습니다.
테이블에 TIMESTAMP 및 DATETIME 값을 삽입할 때 타임존 오프셋을 지정할 수 있습니다. 오프셋은 datetime 리터럴의 time 부분 뒤에 공백 없이 추가되며, time_zone 시스템 변수 설정 시 사용하는 형식과 같은 형식을 사용하되, 다음 예외가 있습니다:
hour 값이 10보다 작은 경우, 앞에 0을 붙여야 합니다(leading zero 필요).
'-00:00' 값은 거부됩니다.
'EET', 'Asia/Shanghai'와 같은 타임존 이름을 사용할 수 없으며, 'SYSTEM' 역시 이 컨텍스트에서는 사용할 수 없습니다.
삽입되는 값의 month 부분, day 부분 또는 두 부분 모두가 0이 되어서는 안 됩니다. 이는 서버 SQL 모드 설정과 관계없이 강제됩니다.
다음 예는 서로 다른 time_zone 설정을 사용하여 타임존 오프셋이 포함된 datetime 값을 TIMESTAMP 및 DATETIME 컬럼에 삽입한 후, 이를 조회하는 방법을 보여줍니다:
1mysql> CREATE TABLE ts ( 2 -> id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 -> col TIMESTAMP NOT NULL 4 -> ) AUTO_INCREMENT = 1; 5 6mysql> CREATE TABLE dt ( 7 -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 8 -> col DATETIME NOT NULL 9 -> ) AUTO_INCREMENT = 1; 10 11mysql> SET @@time_zone = 'SYSTEM'; 12 13mysql> INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'), 14 -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00'); 15 16mysql> SET @@time_zone = '+00:00'; 17 18mysql> INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'), 19 -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00'); 20 21mysql> SET @@time_zone = 'SYSTEM'; 22 23mysql> INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'), 24 -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00'); 25 26mysql> SET @@time_zone = '+00:00'; 27 28mysql> INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'), 29 -> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00'); 30 31mysql> SET @@time_zone = 'SYSTEM'; 32 33mysql> SELECT @@system_time_zone; 34+--------------------+ 35| @@system_time_zone | 36+--------------------+ 37| EST | 38+--------------------+ 39 40mysql> SELECT col, UNIX_TIMESTAMP(col) FROM dt ORDER BY id; 41+---------------------+---------------------+ 42| col | UNIX_TIMESTAMP(col) | 43+---------------------+---------------------+ 44| 2020-01-01 10:10:10 | 1577891410 | 45| 2019-12-31 23:40:10 | 1577853610 | 46| 2020-01-01 13:10:10 | 1577902210 | 47| 2020-01-01 10:10:10 | 1577891410 | 48| 2020-01-01 04:40:10 | 1577871610 | 49| 2020-01-01 18:10:10 | 1577920210 | 50+---------------------+---------------------+ 51 52mysql> SELECT col, UNIX_TIMESTAMP(col) FROM ts ORDER BY id; 53+---------------------+---------------------+ 54| col | UNIX_TIMESTAMP(col) | 55+---------------------+---------------------+ 56| 2020-01-01 10:10:10 | 1577891410 | 57| 2019-12-31 23:40:10 | 1577853610 | 58| 2020-01-01 13:10:10 | 1577902210 | 59| 2020-01-01 05:10:10 | 1577873410 | 60| 2019-12-31 23:40:10 | 1577853610 | 61| 2020-01-01 13:10:10 | 1577902210 | 62+---------------------+---------------------+
오프셋은 값을 삽입할 때 사용되었더라도, datetime 값을 조회(select)할 때는 표시되지 않습니다.
지원되는 오프셋 값 범위는 -13:59에서 +14:00까지(포함)입니다.
타임존 오프셋이 포함된 datetime 리터럴은 준비된 문(prepared statement)의 파라미터 값으로 허용됩니다.
11.1.2 Numeric Literals
11.1.4 Hexadecimal Literals