집 >데이터 베이스 >MySQL 튜토리얼 >mysql 날짜 및 시간 유형
시간 값을 나타내는 DATE 및 시간 유형은 DATETIME, DATE, TIMESTAMP, TIME 및 YEAR입니다. 각 시간 유형에는 유효한 값의 범위와 MySQL이 표현할 수 없는 잘못된 값을 지정할 때 사용되는 "0" 값이 있습니다. TIMESTAMP 유형에는 나중에 설명할 독점적인 자동 업데이트 기능이 있습니다.
잘못된 날짜를 삽입하려고 하면 MySQL에서 경고나 오류가 발생합니다. ALLOW_INVALID_DATES SQL 모드를 사용하여 MySQL이 '1999-11-31'과 같은 특정 날짜를 허용하도록 할 수 있습니다. 향후 처리를 위해 사용자가 데이터베이스(예: 웹 양식)에 지정한 "잘못되었을 수 있는" 값을 저장하려는 경우에 유용합니다. 이 모드에서 MySQL은 월 범위가 0~12이고 일 범위가 0~31인지 확인합니다. MySQL에서는 DATE 또는 DATETIME 열에 일/월 및 일이 0인 날짜를 저장할 수 있으므로 이러한 범위에는 0이 포함될 수 있습니다. 이는 응용 프로그램이 정확한 날짜를 모르는 생일을 저장해야 할 때 유용합니다. 이 경우 날짜를 '1999-00-00' 또는 '1999-01-00'으로 저장하면 됩니다. DATE_SUB() 또는 DATE_ADD와 같이 완전한 날짜가 필요한 함수는 해당 날짜를 저장하면 올바른 결과를 제공하지 않습니다. (날짜에 0이 표시되는 것을 원하지 않으면 NO_ZERO_IN_DATESQL 모드를 사용할 수 있습니다).
MySQL에서는 '0000-00-00'을 "의사 날짜"로 저장할 수도 있습니다(NO_ZERO_DATE SQL 모드를 사용하지 않는 경우). 이는 NULL 값을 사용하는 것보다 어떤 상황에서는 더 편리합니다(그리고 데이터와 인덱스가 더 적은 공간을 차지합니다).
SQL_mode 시스템 변수를 해당 모드 값으로 설정하면 MySQL이 어떤 종류의 날짜를 지원하길 원하는지 더 명확하게 알 수 있습니다.
날짜 및 시간 유형으로 작업할 때 다음 사항에 유의해야 합니다.
· MySQL은 표준 출력 형식으로 지정된 날짜 또는 시간 유형의 값을 검색하지만 지정하는 각 값을 해석하는 것이 가장 좋습니다. 입력 값 형식(예: 날짜 또는 시간 유형에 할당되거나 비교되는 값을 지정하는 경우) 다음 섹션에 설명된 형식만 지원됩니다. 유효한 값을 제공하시기 바랍니다. 다른 형식의 값을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
· 두 자리 연도 값이 포함된 날짜는 세기를 알 수 없기 때문에 모호합니다. MySQL은 다음 규칙을 사용하여 두 자리 연도 값을 해석합니다.
o 70-99 범위의 연도 값은 1970-1999로 변환됩니다.
o 00-69 범위의 연간 값은 2000-2069로 변환됩니다.
· MySQL은 여러 형식으로 값을 해석하려고 시도하지만 날짜는 일반적으로 월-일-년이 아닌 항상 연-월-일 순서(예: '98-09-04')입니다. 또는 일-월-년 순서(예: '09-04-98', '04-09-98')
· MySQL은 값이 숫자 컨텍스트에서 사용되는 경우 날짜 또는 시간 유형 값을 자동으로 숫자로 변환하고 그 반대의 경우도 마찬가지입니다.
· MySQL이 해당 유형에 대해 범위를 벗어나거나 잘못된 날짜 또는 시간 유형 값을 발견하면(이 섹션 시작 부분에 설명된 대로) 해당 값을 해당 클래스의 "0" 값으로 변환합니다. . 한 가지 예외는 범위를 벗어난 TIME 값이 TIME 범위의 해당 끝점으로 잘린다는 것입니다.
다음 표는 다양한 "0" 값의 형식을 보여줍니다. NO_ZERO_DATE SQL 모드가 활성화된 경우 이 값을 사용하면 경고가 생성됩니다.
컬럼 유형 "0" 값
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP 00000000000000
TIME '00:00:00'
YEAR 0000
· "0" 값은 특별한 값이지만, 저장하거나 참조하려면 표에 표시된 항목을 표시하세요. 또한 '0' 또는 0 값을 사용하여 저장하거나 참조할 수 있으므로 작성하기가 더 쉽습니다.
· MyODBC에서 사용되는 "0" 날짜 또는 시간 값은 ODBC가 이러한 값을 처리할 수 없기 때문에 MyODBC 2.50.12 이상에서는 자동으로 NULL로 변환됩니다.
1. DATETIME, DATE, TIMESTAMP 타입
1. MySQL 4.1 이후의 TIMESTAMP 속성
DATETIME, DATE, TIMESTAMP 타입은 서로 연관되어 있습니다. 이 섹션에서는 이들의 특징, 유사점 및 차이점을 설명합니다.
날짜와 시간 정보를 모두 포함하는 값이 필요한 경우 DATETIME 유형을 사용하세요. MySQL은 'YYYY-MM-DD HH:MM:SS' 형식으로 DATETIME 값을 검색하여 표시합니다. 지원되는 범위는 '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59' 입니다. ("지원됨"은 이전 값이 작동할 수 있지만 보장할 수 없음을 의미합니다.)
DATE 타입은 시간 부분 없이 날짜 값만 필요한 경우에 사용해야 합니다. MySQL은 'YYYY-MM-DD' 형식으로 DATE 값을 검색하여 표시합니다. 지원되는 범위는 '1000-01-01'~'9999-12-31'입니다.
TIMESTAMP 열 유형의 속성은 고정되지 않으며 MySQL 버전과 서버가 실행 중인 SQL 모드에 따라 달라집니다. 이러한 속성은 이 섹션의 뒷부분에서 설명됩니다.
DATETIME, DATE 및 TIMESTAMP 값은 일반적인 형식을 사용하여 지정할 수 있습니다:
· 'YYYY-MM-DD HH:MM:SS' 또는 'YY-MM-DD HH: MM:SS '형식 문자열입니다. "완화된" 구문이 허용됩니다. 구두점 문자는 날짜 부분이나 시간 부분 사이의 구분 기호로 사용될 수 있습니다. 예를 들어 '98-12-31 11:30:45', '98.12.31 11+30+45', '98/12/31 11*30*45' 및 '98@12@31 11^30^ 45'는 동일합니다.
· 'YYYY-MM-DD' 또는 'YY-MM-DD' 형식의 문자열입니다. 여기서는 "Relaxed" 구문도 허용됩니다. 예를 들어 '98-12-31', '98.12.31', '98/12/31' 및 '98@12@31'은 동일합니다.
· 구분 기호 없이 'YYYYMMDDHHMMSS' 또는 'YYMMDDHHMMSS' 형식의 문자열(문자열이 날짜 유형에 의미가 있다고 가정). 예를 들어 '19970523091528'과 '970523091528'은 '1997-05-23 09:15:28'로 해석되지만 '971122129015'는 불법(의미 없는 분 부분이 있음)이므로 '0000-00-00 00'이 됩니다. :00:00'.
· 구분 기호가 없는 'YYYYMMDD' 또는 'YYMMDD' 형식의 문자열(문자열이 날짜 유형에 의미가 있다고 가정). 예를 들어 '19970523'과 '970523'은 '1997-05-23'으로 해석되지만 '971332'는 불법(의미 없는 월과 일 부분이 있음)이므로 '0000-00-00''이 됩니다.
· YYYYMMDDHHMMSS 또는 YYMMDDHHMMSS 형식의 숫자(숫자가 날짜 유형에 적합하다고 가정). 예를 들어 19830905132800 및 830905132800은 '1983-09-05 13:28:00'으로 해석됩니다.
· YYYYMMDD 또는 YYMMDD 형식의 숫자(숫자가 날짜 유형에 적합하다고 가정). 예를 들어 19830905 및 830905는 '1983-09-05'로 해석됩니다.
· 함수가 반환한 결과 값은 NOW() 또는 CURRENT_DATE와 같은 DATETIME, DATE 또는 TIMESTAMP 컨텍스트에 적합합니다.
잘못된 DATETIME, DATE 또는 TIMESTAMP 값은 해당 유형('0000-00-00 00:00:00', '0000-00-00' 또는 00000000000000)의 "0" 값으로 변환됩니다. ).
날짜 부분 구분 기호가 포함된 문자열 값의 경우 일 및 월 값이 10 미만이면 두 자리를 지정할 필요가 없습니다. '1979-6-9'는 '1979-06-09'와 동일합니다. 마찬가지로 시간 부분 구분 기호가 포함된 문자열 값의 경우 시, 분, 초 값이 10보다 작으면 두 자리를 지정할 필요가 없습니다. '1979-10-30 1:2:3'은 '1979-10-30 01:02:03'과 동일합니다.
숫자값은 6, 8, 12, 14자리여야 합니다. 숫자 길이가 8자리 또는 14자리인 경우 YYYYMMDD 또는 YYYYMMDDHHMMSS 형식으로 간주되며 처음 4자리는 연도를 나타냅니다. 숫자가 6자리 또는 12자리인 경우 YYMMDD 또는 YYMMDDHHMMSS 형식으로 간주되며 처음 2자리는 연도를 나타냅니다. 다른 숫자는 가장 가까운 길이까지 0으로 채워진 것처럼 해석됩니다.
부정 문자열로 지정된 값은 주어진 길이를 사용하여 해석됩니다. 문자열 길이가 8자 또는 14자인 경우 처음 4자리는 연도를 나타냅니다. 그렇지 않은 경우 처음 두 자리는 연도를 나타냅니다. 문자열 내에서 발생하는 각 구성요소를 왼쪽에서 오른쪽으로 해석하여 연도, 월, 일, 시, 분, 초 값을 알아냅니다. 즉, 6자보다 짧은 문자열은 사용하면 안 됩니다. 예를 들어, 1999년 3월을 의미한다고 생각하여 '9903'을 지정하면 MySQL은 테이블에 "0" 날짜 값을 삽입합니다. 연도와 월의 값이 99와 03인데 일 부분이 완전히 빠졌기 때문에 그 값은 법적 날짜가 아니기 때문이다. 그러나 누락된 월 또는 일 부분을 나타내기 위해 명시적으로 0 값을 지정할 수 있습니다. 예를 들어 '990300'을 사용하여 '1999-03-00' 값을 삽입할 수 있습니다.
어느 정도까지는 한 날짜 유형의 값을 다른 날짜 유형에 할당할 수 있습니다. 그러나 값이 변경되거나 일부 정보가 손실될 수 있습니다.
· DATETIME 또는 TIMESTAMP 객체에 DATE 값을 할당하면 결과 값의 시간 부분이 '00:00:00'으로 설정됩니다. DATE 값에는 시간 정보가 포함되어 있지 않습니다.
· DATE 객체에 DATETIME 또는 TIMESTAMP 값을 할당하면 DATE 값에 시간 정보가 포함되어 있지 않으므로 결과 값의 시간 부분이 제거됩니다.
· DATETIME, DATE, TIMESTAMP 값은 동일한 형식을 사용하여 지정할 수 있지만 값 유형에 따라 범위가 다르다는 점을 기억하세요. 예를 들어 TIMESTAMP 값은 1970년 이전이거나 2037년 이후일 수 없습니다. 이는 '1968-01-01'과 같은 날짜가 DATETIME 또는 DATE 값에는 유효하지만 TIMESTAMP 값에는 유효하지 않으며 해당 객체에 할당되면 0으로 변환됨을 나타냅니다.
날짜 값을 지정할 때 주의할 점:
· 문자열로 지정된 값에 허용되는 엄격하지 않은 형식은 기만적일 수 있습니다. 예를 들어 '10:11:12' 값은 ':' 구분 기호로 인해 시간 값처럼 보일 수 있지만 날짜 컨텍스트 값에 사용되면 '2010-11-12' 연도로 해석됩니다. '10:45:15' 값은 '45'가 법정 월이 아니기 때문에 '0000-00-00'으로 변환됩니다.
· 비엄격 모드에서 MySQL 서버는 날짜의 유효성에 대한 기본 검사만 수행합니다. 연도, 월, 일의 범위는 각각 1000~9999, 00~12, 00~31입니다. 이 범위를 벗어나는 부분을 포함하는 모든 날짜는 '0000-00-00'으로 변환됩니다. '2002-04-31'과 같은 잘못된 날짜를 저장할 수는 있습니다. 엄격 모드를 사용하지 않을 때 날짜가 유효한지 확인하려면 애플리케이션을 확인해야 합니다.
엄격 모드에서는 잘못된 날짜가 허용되지 않으며 변환되지 않습니다.
· 두 자리 연도 값이 포함된 날짜는 세기를 알 수 없기 때문에 모호합니다. MySQL은 다음 규칙을 사용하여 두 자리 연도 값을 해석합니다.
o 00-69 범위의 연도 값은 2000-2069로 변환됩니다.
o 70-99 범위의 연간 값은 1970-1999로 변환됩니다.
1.1. MySQL 4.1 이후의 TIMESTAMP 속성
참고: 이전 버전의 MySQL(4.1 이전)에서는 TIMESTAMP 열 유형의 속성이 이 섹션에 설명된 것과 여러 면에서 크게 달랐습니다. MySQL 5.1에서 작동하도록 이전 TIMESTAMP 데이터를 변환해야 하는 경우 자세한 내용은 MySQL 4.1 참조 설명서를 참조하세요.
TIMESTAMP 열의 표시 형식은 DATETIME 열의 표시 형식과 동일합니다. 즉, 표시 너비는 19자로 고정되고 형식은 YYYY-MM-DD HH:MM:SS입니다.
MySQL 서버는 MAXDB 모드에서도 실행될 수 있습니다. 서버가 이 모드에서 실행 중이면 TIMESTAMP는 DATETIME과 같습니다. 즉, 테이블 생성 시 서버가 MAXDB 모드로 실행 중이면 TIMESTAMP 컬럼이 DATETIME 컬럼으로 생성된다. 결과적으로 열은 DATETIME 표시 형식을 사용하고, 값 범위가 동일하며, 현재 날짜 및 시간으로 자동으로 초기화되거나 업데이트되지 않습니다.
MAXDB 모드를 활성화하려면 서버를 시작할 때 --sql-mode=MAXDB 서버 옵션을 사용하거나 전역 sql_mode 변수를 설정하여 런타임 시 SQL 서버 모드를 MAXDB로 설정하세요.
mysql> SET GLOBAL sql_mode=MAXDB;
클라이언트는 다음과 같이 연결을 위해 MAXDB 모드에서 서버를 실행할 수 있습니다.
mysql> SET SESSION sql_mode=MAXDB;
MySQL은 일 또는 월 열에 0을 포함하거나 잘못된 날짜 값을 포함하는 타임스탬프 값을 허용하지 않습니다. . 이 규칙의 유일한 예외는 특수 값 '0000-00-00 00:00:00'입니다.
TIMESTAMP를 초기화하고 업데이트할 시기와 초기화하고 업데이트할 열을 매우 유연하게 결정할 수 있습니다.
· 현재 타임스탬프를 기본값으로 지정하고 자동으로 업데이트되는 값을 지정할 수 있습니다. 하지만 하나만 선택할 수도 있고 둘 다 선택할 수도 없습니다. (한 열이 하나의 동작을 선택하고 다른 열이 다른 동작을 선택하는 것은 불가능합니다.)
· 현재 날짜 및 시간으로 자동으로 초기화되거나 업데이트되는 TIMESTAMP 열을 지정할 수 있습니다. 첫 번째 TIMESTAMP 열은 더 이상 필요하지 않습니다.
아래에 설명된 정보는 MAXDB 모드를 활성화하지 않고 생성된 테이블의 TIMESTAMP 열에만 적용된다는 점에 유의하세요. (위에서 언급한 것처럼 MAXDB 모드를 사용하면 열이 DATETIME 열로 생성됩니다.) TIMESTAMP 컬럼의 초기화 및 업데이트를 제어하는 규칙은 다음과 같습니다.
· 테이블의 첫 번째 TIMESTAMP 컬럼이 DEFAULT 값으로 지정된 경우 무시할 수 없습니다. 기본값은 CURRENT_TIMESTAMP 또는 상수 날짜 및 시간 값일 수 있습니다.
· DEFAULT NULL은 첫 번째 TIMESTAMP 열의 DEFAULT CURRENT_TIMESTAMP와 동일합니다. 다른 TIMESTAMP 열의 경우 DEFAULT NULL은 DEFAULT 0으로 처리됩니다.
· 테이블의 모든 TIMESTAMP 열은 현재 타임스탬프 및/또는 업데이트로 자동 초기화되도록 설정할 수 있습니다.
· CREATE TABLE 문에서 다음 방법 중 하나로 첫 번째 TIMESTAMP 열을 선언할 수 있습니다.
o 기본값을 사용하려면 DEFAULT CURRENT_TIMESTAMP 및 ON UPDATE CURRENT_TIMESTAMP 절을 사용하세요. 현재 타임스탬프가 자동으로 업데이트됩니다.
o DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP와 마찬가지로 DEFAULT 또는 ON UPDATE 절을 사용하지 않습니다.
o ON UPDATE 절 대신 DEFAULT CURRENT_TIMESTAMP 절을 사용합니다. 기본값은 현재 타임스탬프를 사용하지만 자동으로 업데이트되지 않습니다.
o DEFAULT 절은 없지만 ON UPDATE CURRENT_TIMESTAMP 절이 있는 경우 열의 기본값은 0이며 자동으로 업데이트됩니다.
o 상수 DEFAULT 값을 사용하고 제공된 기본값이 나열됩니다. 열에 ON UPDATE CURRENT_TIMESTAMP 절이 있으면 자동으로 업데이트되고 그렇지 않으면 업데이트되지 않습니다.
즉, 초기 값과 자동 업데이트 값에 현재 타임스탬프를 사용하거나 둘 중 하나를 사용하거나 둘 다 사용하지 않을 수 있습니다. (예를 들어 ON UPDATE를 지정하면 열을 자동으로 초기화하지 않고도 자동 업데이트를 활성화할 수 있습니다.)
· DEFAULT 및 ON UPDATE 절에 CURRENT_TIMESTAMP, CURRENT_TIMESTAMP() 또는 NOW()를 사용할 수 있습니다. 모두 동일한 효과가 있습니다.
두 속성의 순서는 중요하지 않습니다. TIMESTAMP 열에 DEFAULT와 ON UPDATE가 모두 지정된 경우 둘 중 하나가 다른 것 앞에 올 수 있습니다.
예에서 다음 명령문은 동일합니다.
CREATE TABLE t (ts TIMESTAMP); CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
· 1열이 아닌 TIMESTAMP 열에 대해 자동 기본값을 지정하거나 업데이트하려면 상수 할당을 인쇄하여 첫 번째 TIMESTAMP를 인쇄해야 합니다. 자동 초기화 및 업데이트를 비활성화하는 DEFAULT 값입니다. (예를 들어 DEFAULT 0 또는 DEFAULT '2003-01-01 00:00:00'). 그런 다음 다른 TIMESTAMP 열의 경우 규칙은 DEFAULT 및 ON UPDATE 절을 무시할 수 없다는 점을 제외하고 첫 번째 TIMESTAMP 열과 동일합니다. 이렇게 하면 초기화나 업데이트가 자동으로 발생하지 않습니다.
예: 다음 명령문은 동일합니다.
CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
현재 시간대는 각 연결에 대해 설정할 수 있습니다. TIMESTAMP 값은 UTC 형식으로 저장되며, 저장 시 현재 시간대로 변환되고, 검색 시 다시 현재 시간대로 변환됩니다. 타임존 설정 값이 일정하면 저장 당시의 값을 얻을 수 있습니다. TIMESTAMP 값을 저장한 경우 시간대를 변경한 후 값을 검색해야 하며, 저장한 값과 다릅니다. 이는 양방향 변환에 동일한 시간대를 사용하지 않기 때문입니다. 현재 시간대를 time_zone 시스템 변수의 값으로 사용할 수 있습니다.
TIMESTAMP 열 정의에 NULL 속성을 포함하면 열에 NULL 값이 포함될 수 있습니다. 예:
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
如果未指定NULL属性,将列设置为NULL设置则会将它设置为当前的时间戳。请注意允许NULL值的TIMESTAMP列不会采用当前的时间戳,除非要么其 默认值定义为CURRENT_TIMESTAMP,或者NOW()或CURRENT_TIMESTAMP被插入到该列内。换句话说,只有使用如下定义创建,定义为 NULL的TIMESTAMP列才会自动更新:
CREATE TABLE t (ts NULLDEFAULT CURRENT_TIMESTAMP);
否则-也就是说,如果使用NULL而不是DEFAULT TIMESTAMP来定义TIMESTAMP列,如下所示...
CREATE TABLE t1 (ts NULL DEFAULT NULL); CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');
...则必须显式插入一个对应当前日期和时间的值。例如:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
2. TIME类型
MySQL以'HH:MM:SS'格式检索和显示TIME值(或对于大的小时值采用'HHH:MM:SS'格式)。TIME值的范围可以从'-838:59:59'到'838:59:59'。小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。
你可以用各种格式指定TIME值:
· 'D HH:MM:SS.fraction'格式的字符串。还可以使用下面任何一种“非严格”语法:'HH:MM:SS.fraction'、'HH:MM:SS'、'HH:MM'、'D HH:MM:SS'、'D HH:MM'、'D HH'或'SS'。这里D表示日,可以取0到34之间的值。请注意MySQL还不保存分数。
· 'HHMMSS'格式的没有间割符的字符串,假定是有意义的时间。例如,'101112'被理解为'10:11:12',但'109712'是不合法的(它有一个没有意义的分钟部分),将变为'00:00:00'。
· HHMMSS格式的数值,假定是有意义的时间。例如,101112被理解为'10:11:12'。下面格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。请注意MySQL还不保存分数。
· 函数返回的结果,其值适合TIME上下文,例如CURRENT_TIME。
对于指定为包括时间部分间割符的字符串的TIME值,如果时、分或者秒值小于10,则不需要指定两位数。'8:3:2'与'08:03:02'相同。
为TIME列分配简写值时应注意。没有冒号,MySQL解释值时假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,你可能认为'1112'和1112表示'11:12:00'(11点过12分),但MySQL将它们解释为'00:11:12'(11分,12 秒)。同样,'12'和12 被解释为 '00:00:12'。相反,TIME值中使用冒号则肯定被看作当天的时间。也就是说,'11:12'表示'11:12:00',而不是'00:11:12'。
超出TIME范围但合法的值被裁为范围最接近的端点。例如,'-850:00:00'和'850:00:00'被转换为'-838:59:59'和'838:59:59'。
无效TIME值被转换为'00:00:00'。请注意由于'00:00:00'本身是一个合法TIME值,只从表内保存的一个'00:00:00'值还不能说出原来的值是 '00:00:00'还是不合法的值。
3. YEAR类型
YEAR类型是一个单字节类型用于表示年。
MySQL以YYYY格式检索和显示YEAR值。范围是1901到2155。
可以指定各种格式的YEAR值:
· 四位字符串,范围为'1901'到'2155'。
· 四位数字,范围为1901到2155。
· 两位字符串,范围为'00'到'99'。'00'到'69'和'70'到'99'范围的值被转换为2000到2069和1970到1999范围的YEAR值。
· 两位整数,范围为1到99。1到69和70到99范围的值被转换为2001到2069和1970到1999范围的YEAR值。请注意两位整数范围与两位字符串范围稍有不同,因为你不能直接将零指定为数字并将它解释为2000。你必须将它指定为一个字符串'0'或'00'或它被解释为0000。
· 函数返回的结果,其值适合YEAR上下文,例如NOW()。
非法YEAR值被转换为0000。
4. Y2K事宜和日期类型
MySQL本身对于2000年(Y2K)是安全的,但输入给MySQL的值可能不安全。任何包含两位年值的输入都会令人模糊,因为世纪不知道。这些值必须解释为四位形式,因为MySQL内部使用四位来保存年。
对于DATETIME、DATE、TIMESTAMP和YEAR类型,MySQL使用以下规则解释含模糊年值的日期:
· 00-69范围的年值转换为2000-2069。
· 70-99范围的年值转换为1970-1999。
请记住这些规则只是合理猜测数据值表示什么。如果MySQL使用的启发不能产生正确的值,你应提供包含四位年值的确切输入。
ORDER BY可以正确排序有两位年的TIMESTAMP或YEAR值。
MIN() 및 MAX()와 같은 일부 함수는 TIMESTAMP 또는 YEAR를 숫자로 변환합니다. 이는 두 자리 연도 값을 갖는 값에서는 이러한 함수가 올바르게 작동하지 않음을 의미합니다. 이 경우 해결 방법은 TIMESTAMP 또는 YEAR를 4자리 연도 형식으로 변환하거나 MIN(DATE_ADD(TIMESTAMP,INTERVAL 0 DAYS))를 사용하는 것입니다.