11.3.6 시간 값의 소수 초
MySQL 5.6.4 이전 버전에서는 기간 값을 소수 초 부분이 허용되는 인스턴스는 제한되어 있습니다. 후속 소수 리터럴 값 등의 컨텍스트에서 허용되는 일부 시간 함수의 인수 또는 거기에서 반환 값으로 허용되어 있습니다. 예 :
mysql>
SELECT MICROSECOND('2010-12-10 14:12:09.019473');
+-------------------------------------------+ | MICROSECOND('2010-12-10 14:12:09.019473') | +-------------------------------------------+ | 19473 | +-------------------------------------------+
그러나 MySQL은 시간 데이터 유형의 컬럼에 값을 저장하면 소수부를 파기하고 그것을 저장하지 않습니다.
MySQL 5.6.4 이후에서는 마이크로 초 (6 자리)까지의 정확도를 가진 TIME
, DATETIME
, 그리고 TIMESTAMP
값에 소수 초 지원을 확장하고 있습니다.
소수 초 부분을 포함 컬럼을 정의하려면
구문을 사용합니다. 여기에서type_name
(fsp
)type_name
은TIME
,DATETIME
또는TIMESTAMP
이며,fsp
는 소수 초 정도입니다. 예 :CREATE TABLE t1 (t TIME (3) dt DATETIME (6));
fsp
값을 지정하는 경우, 0-6의 범위에 있어야합니다. 0의 값은 소수가 없음을 나타냅니다. 생략하면 기본 정도는 0입니다. (이것은 이전의 MySQL 버전과 호환성을 유지하기 위해 표준 SQL의 기본 인 6과 다릅니다.)소수 초 부분을 가진
TIME
,DATE
또는TIMESTAMP
값을 같은 형태의 컬럼에 삽입하지만, 소수 자릿수가 적은 경우, 다음의 예와 같이 반올림이 이루어집니다.mysql>
CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );
Query OK, 0 rows affected (0.33 sec) mysql>INSERT INTO fractest VALUES
>('17:51:04.777', '2014-09-08 17:51:04.777', '2014-09-08 17:51:04.777');
Query OK, 1 row affected (0.03 sec) mysql>SELECT * FROM fractest;
+-------------+------------------------+------------------------+ | c1 | c2 | c3 | +-------------+------------------------+------------------------+ | 17:51:04.78 | 2014-09-08 17:51:04.78 | 2014-09-08 17:51:04.78 | +-------------+------------------------+------------------------+ 1 row in set (0.00 sec)이러한 반올림했을 때에 경고 나 오류가 표시되지 않습니다. 이 동작은 SQL 표준에 따라 서버
sql_mode
설정의 영향을받지 않습니다.시간 인수를 취하는 함수는 초 부분을 포함한 값을 받아들입니다. 시간 함수의 반환 값은 필요에 따라 소수 초이 포함됩니다. 예를 들어, 인수없이
NOW()
는 소수 부분이없는 현재의 날짜와 시간을 반환하지만 0-6의 옵션 인수를 가지고 그 자리수의 소수 초 부분이 반환 값에 포함되어있는 수를 지정합니다.시간 리터럴 구문은
DATE '
,str
'TIME '
및str
'TIMESTAMP '
시간 값과 ODBC 구문 동등한 값을 얻을 수 있습니다. 지정되는 경우 결과 값은 후속 소수 초 부분이 포함됩니다. 이전에는 시간 형 키워드는 무시되고 이러한 구조는 문자열 값을 생성하고있었습니다. 표준 SQL과 ODBC 날짜 및 시간 리터럴 을 참조하십시오.str
'
경우에 따라서는 이전에 받아 들여지고 구문이 다른 결과를 생성 할 수 있습니다. 다음 항목은 문제를 해결하기 위해 기존 코드의 어느 부분을 변경해야하는 여부를 나타냅니다.
행사 기간 동안 이전의 결과와는 다른 결과를 생성하는 것이 있습니다. 예 :
timestamp
시스템 변수는 정수가 아닌 마이크로 초 소수가 포함 된 값을 반환합니다. 현재 시간을 포함하는 결과를 반환하는 함수 (CURTIME()
,SYSDATE()
,UTC_TIMESTAMP()
등)는fsp
값으로 인수를 해석하고, 반환 값은 그 자리의 소수 초 부분이 포함됩니다. 이전에는 이러한 함수는 인수를 허용하지했지만 무시하고있었습니다.TIME
값은 현재 날짜에 시간을 추가함으로써DATETIME
으로 변환됩니다. (이것은 시간 값이'00:00:00'
에서'23:59:59'
의 범위를 벗어난 경우, 결과의 날짜 부분이 현재의 날짜와 다르다는 것을 의미합니다.) 이전에 은TIME
값의DATETIME
으로 변환 신뢰성이 없습니다. 섹션 11.3.7 "날짜 및 시간 형식 간의 변환" 을 참조하십시오.TIMESTAMP(
은 이전 MySQL 버전에서 허용되고 있었지만,N
)N
은 소수 초 정도가 아니라 표시 폭이었습니다. 이 동작의 지원은 MySQL 5.5.3에서 폐지 되었기 때문에 비교적 최신 상태로 유지되고있는 어플리케이션이면이 문제의 영향을받지 않습니다. 그렇지 않으면이 코드를 다시 작성해야합니다.