>  기사  >  데이터 베이스  >  MySQL 기초 튜토리얼 2 — 데이터 유형: 날짜 및 시간 유형

MySQL 기초 튜토리얼 2 — 데이터 유형: 날짜 및 시간 유형

黄舟
黄舟원래의
2017-02-24 10:57:361235검색

시간 값을 나타내는 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 모드가 활성화된 경우 이 값을 사용하면 경고가 생성됩니다.

列类型 ”值
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 열 유형의 속성이 여러 면에서 달랐습니다. 이는 섹션에 설명된 것과 매우 다릅니다. 이전 TIMESTAMP 데이터를 MySQL 5.1에서 작동하도록 변환해야 하는 경우 자세한 내용은 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);

· 要为TIMESTAMP列而不是第1列指定自动默认或更新,必须通过将第1个TIMESTAMP列显式分配一个常量DEFAULT值来禁用自动初始化和更新。(例如,DEFAULT 0或DEFAULT'2003-01-01 00:00:00')。然后,对于其它TIMESTAMP列,规则与第1个TIMESTAMP列相同,例外情况是不能忽略DEFAULT和ON UPDATE子句。如果这样做,则不会自动进行初始化或更新。

例如:下面这些语句是等效的:

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'까지의 4자리 문자열.

· 1901부터 2155까지의 네 자리 숫자입니다.

· '00'부터 '99'까지의 두 자리 문자열입니다. '00'~'69' 및 '70'~'99' 범위의 값은 2000~2069 및 1970~1999 범위의 YEAR 값으로 변환됩니다.

· 1~99 범위의 두 자리 정수. 1~69 및 70~99 범위의 값은 2001~2069 및 1970~1999 범위의 YEAR 값으로 변환됩니다. 두 자리 정수 범위는 0을 숫자로 직접 지정하고 2000으로 해석할 수 없다는 점에서 두 자리 문자열 범위와 약간 다릅니다. 문자열 '0' 또는 '00'으로 지정해야 합니다. 그렇지 않으면 0000으로 해석됩니다.

· NOW()와 같이 YEAR 컨텍스트에 적합한 값을 갖는 함수에서 반환된 결과입니다.

잘못된 YEAR 값은 0000으로 변환됩니다.

4. Y2K 사항 및 날짜 유형

MySQL 자체는 2000년(Y2K)에는 안전하지만 MySQL에 입력된 값은 안전하지 않을 수 있습니다. 두 자리 연도 값을 포함하는 모든 입력은 세기를 알 수 없기 때문에 모호합니다. MySQL은 내부적으로 연도를 저장하기 위해 4자리 숫자를 사용하기 때문에 이러한 값은 4자리 숫자로 해석되어야 합니다.

DATETIME, DATE, TIMESTAMP, YEAR 유형의 경우 MySQL은 다음 규칙을 사용하여 모호한 연도 값이 있는 날짜를 해석합니다.

· 00-69 범위의 연도 값이 변환됩니다. 2000-2069년까지.

· 70~99 범위의 연간 값을 1970~1999로 변환합니다.

이러한 규칙은 데이터 값이 나타내는 내용에 대한 합리적인 추측일 뿐이라는 점을 기억하세요. MySQL에서 사용하는 경험적 방법이 올바른 값을 생성하지 못하는 경우 4자리 연도 값이 포함된 정확한 입력을 제공해야 합니다.

ORDER BY는 TIMESTAMP 또는 YEAR 값을 연도 두 자리로 올바르게 정렬할 수 있습니다.

MIN() 및 MAX()와 같은 일부 함수는 TIMESTAMP 또는 YEAR를 숫자로 변환합니다. 이는 두 자리 연도 값을 갖는 값에서는 이러한 함수가 올바르게 작동하지 않음을 의미합니다. 이 경우 해결 방법은 TIMESTAMP 또는 YEAR를 4자리 연도 형식으로 변환하거나 MIN(DATE_ADD(TIMESTAMP,INTERVAL 0 DAYS))를 사용하는 것입니다.

위는 MySQL 기본 튜토리얼 2 - 날짜 및 시간 유형의 데이터 유형에 대한 내용입니다. 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.