타임스탬프 데이터 유형입니다. 날짜, 시간 및 날짜/시간 데이터 유형입니다. 날짜 및 시간 입력 형식

DATETIME, DATE 및 TIMESTAMP 유형

DATETIME, DATE 및 TIMESTAMP 유형은 서로 관련되어 있습니다. 이 섹션에서는 특성, 유사점 및 차이점에 대해 설명합니다.
DATETIME 타입은 날짜와 시간을 모두 포함하는 값이 필요할 때 사용합니다. MySQL은 TGYT-MM-DD HH:MM:SS". :59" 형식으로 DATETIME 값을 검색하고 표시합니다.
DATE 타입은 시간 없이 날짜만 포함된 값이 필요할 때 사용합니다. MySQL은 "YYYY-MM-DD" 형식으로 DATETIME 값을 검색하고 표시합니다. 지원되는 범위는 H000-01-0Y에서 "9999-12-31"까지입니다.
TIMESTAMP 열 유형에는 MySQL 버전 및 서버가 실행 중인 SQL 모드에 따라 여러 속성이 있습니다. 이러한 속성은 이 섹션의 뒷부분에서 설명합니다.
일반적인 형식 집합을 사용하여 DATETIME, DATE 및 TIMESTAMP 유형의 값을 지정할 수 있습니다.

  1. "YYYY-MM-DD HH:MM:SS" 또는 "YY-MM-DD HH:MM:SS" 형식의 문자열. 편안한 구문이 허용됩니다. 모든 구두점 문자를 날짜와 시간 사이의 구분 기호로 사용할 수 있습니다. 예를 들어 "98-12-31 11:30:45", "12/98/31 11+30+45", "98/12/31 11*30*45" 및 "98012031 11L30L45"가 동일합니다.
  2. "YYYY-MM-DD" 또는 "YY-MM-DD" 형식의 문자열입니다. 완화된 구문도 허용됩니다. 예를 들어 "98-12-31", "98.12.31", "98/12/31" 및 "98012031" 값은 동일합니다.
  3. "YYYYMMDDHHMMSS" 또는 "YYMMDDHHMMSS" 형식의 구분 기호가 없는 문자열로, 문자열이 날짜로 의미가 있다고 가정합니다. 예를 들어 "19970523091528"과 "970523091528"은 "1997-0 5-23 09:15:28"로 해석되지만 "971122129015"는 잘못된 분 값이기 때문에 "0-0000-0"이 됩니다. 00:00: 00".
  4. "YYYYMMDD" 또는 THMMDD" 형식의 구분 기호가 없는 문자열로, 문자열이 날짜로 이해된다고 가정합니다. 예를 들어 "19970523" 및 "980523"은 "1997-05-23"으로 해석되지만 "971332"는 올바르지 않은(잘못된 값의 월과 일) "0000-00-00"이 됩니다.
  5. 숫자가 날짜로 의미가 있다고 가정하면 YYYYMMDDHHMMSS 또는 YYMMDDHHMMSS 형식의 숫자입니다. 예를 들어, 19830905132800 및 830905132800은 "1983-09-05 13:28:00"으로 해석됩니다.
  6. 숫자가 날짜로 의미가 있다고 가정하면 YYYYMMDD 또는 YYMMDD 형식의 숫자입니다. 예를 들어, 19830905 및 830905는 "1983-09-05"로 해석됩니다.
  7. NOW() 또는 CURRENT_DATE와 같은 DATETIME, DATE 또는 TIMESTAMP 컨텍스트에서 허용되는 값을 반환하는 함수의 결과입니다.

잘못된 DATETIME, DATE 또는 TIMESTAMP 값은 적절한 유형("0000-00-00 00:00:00", "0000-00-00" 또는 00000000000000)의 null 값으로 변환됩니다.
날짜 구분 기호를 포함하는 문자열로 지정된 값의 경우 10보다 작은 월 또는 일에 두 자리 숫자를 지정할 필요가 없습니다. "1976-6-9"는 "1976-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 형식으로 가정하고 연도는 두 자리 숫자로 제공됩니다. 길이가 6, 8, 12 및 14와 다른 숫자는 지정된 계열에서 가장 가까운 자릿수까지 선행 0으로 채워집니다.

구분 기호 없이 문자열로 주어진 값은 위에서 설명한 대로 길이를 사용하여 해석됩니다. 문자열이 8자 또는 14자이면 연도는 4자리 형식으로 간주됩니다. 그렇지 않으면 연도가 처음 두 문자로 지정된 것으로 가정합니다. 문자열은 왼쪽에서 오른쪽으로 해석되어 연도, 월, 일, 시, 분 및 초 값을 추출합니다. 즉, 6자보다 짧은 문자열을 사용하면 안 됩니다. 예를 들어, 1999년 3월을 의미하는 "9903"을 입력하면 MySQL이 테이블에 null 날짜를 삽입한다는 것을 알 수 있습니다. 연도와 월 값이 99와 03인데 일 부분이 완전히 빠져서 값이 정확한 날짜를 설정하지 않았기 때문입니다. 그러나 MySQL 3.23부터 명시적으로 월 또는 일을 0으로 설정할 수 있습니다. 예를 들어, "990300"을 지정하여 "1999-03-00" 값을 테이블에 삽입할 수 있습니다.
특정 제한 내에서 한 유형의 값을 다른 유형의 개체에 할당할 수 있습니다. 그러나 정보 손실로 인해 일부 왜곡이 발생할 수 있습니다.

  1. DATETIME 또는 TIMESTAMP 개체에 DATE 값을 할당하면 DATE 값에 시간 정보가 포함되지 않기 때문에 값의 시간 부분을 "00:00:00"으로 가정합니다.
  2. DATETIME 또는 tiMesTAMP 유형의 값을 DATE 개체에 할당하면 DATE에 포함할 수 없기 때문에 값의 시간 부분이 손실됩니다.
  3. DATETIME, DATE 및 TIMESTAMP 값은 모두 동일한 형식 집합을 사용하여 지정할 수 있지만 유효한 범위는 다릅니다. 예를 들어 TIMESTAMP 값은 1970년 이전 또는 2037년 이후일 수 없습니다. 이것은 DATETIME 또는 DATE 값으로 완벽하게 유효한 "1968-01-10"과 같은 날짜가 TIMESTAMP에 대해 유효하지 않으며 이러한 개체에 할당될 때 0으로 변환됨을 의미합니다.

날짜 값을 지정할 때 염두에 두어야 할 몇 가지 함정도 있습니다.

  1. 문자열로 주어진 값의 편안한 형식은 오해의 소지가 있습니다. 예를 들어 "10:11:12"와 같은 값은 ":" 구분 기호가 사용되기 때문에 시간처럼 보일 수 있지만 날짜 컨텍스트에서 사용되는 경우 "2010-11-12"로 해석됩니다. 동시에 값 "10:45:15"
    "45"는 유효한 월이 아니기 때문에 "0000-00-00"으로 변환됩니다.
  2. MySQL 서버는 기본적인 날짜 유효성 검사만 수행합니다: 연도, 월 및 일 범위는 각각 1000~9999, 00~12, 00~31입니다. 이 범위를 벗어난 부분을 포함하는 모든 날짜는 " 0000-00-"로 변환됩니다. 00". 이렇게 하면 "2002-04-31"과 같은 잘못된 날짜를 저장할 수 있습니다. 날짜가 정확한지 확인하려면 애플리케이션 내에서 유효성 검사를 수행하십시오.
  • 두 자리 연도가 포함된 날짜는 세기를 알 수 없기 때문에 모호합니다. MySQL은 두 자리 연도를 다음과 같이 해석합니다. * 00-69 범위의 연도는 2000-2069로 변환됩니다.
  • 70-99 범위의 연도는 1970-1999로 변환됩니다.
MySQL 4.1 이전 버전의 TIMESTAMP 속성
TIMESTAMP는 UPDATE 또는 INSERT 작업을 수행할 때 현재 날짜와 시간을 자동으로 스탬프하는 데 사용할 수 있는 열 유형입니다. 테이블에 여러 TIMESTAMP 열이 있는 경우 첫 번째 열만 자동으로 업데이트됩니다.
다음 조건 중 하나가 발생하면 테이블의 첫 번째 TIMESTAMP 열이 자동으로 업데이트됩니다.
  1. 명시적으로 NULL 값을 할당합니다.
  2. 열이 INSERT 또는 LOAD DATA INFILE 문에 명시적으로 지정되지 않았습니다.
  3. 열이 UPDATE 문에 명시적으로 지정되지 않고 다른 열의 값이 변경됩니다. 열을 이전과 동일한 값으로 설정하는 UPDATE 문은 TIMESTAMP 열을 업데이트하지 않습니다. 이전 값을 할당하면 MySQL은 효율성을 위해 이를 무시합니다.

TIMESTAMP 열은 원하는 값으로 명시적으로 설정된 경우 현재 날짜 및 시간으로 업데이트할 수도 있습니다. 이는 첫 번째 TIMESTAMP 열의 경우에도 마찬가지입니다. 예를 들어, 행이 생성될 때 열 값을 현재 날짜 및 시간으로 설정하고 나중에 행이 업데이트될 때 변경하지 않으려는 경우 이 속성을 사용할 수 있습니다.

  1. 행이 생성될 때 MySQL이 열의 값을 설정하도록 합니다. 현재 날짜와 시간으로 초기화합니다.
  2. 행의 다른 열에 대한 후속 업데이트를 수행할 때 TIMESTAMP 열의 값을 현재 값으로 설정합니다.

업데이트 table_name
세트 열_에임스 tamp-column_ytestamp, other_column1 = new_value1, other_column2= new_reference2, ...
행이 생성된 시간을 기록하는 열을 유지하는 또 다른 방법은 행이 생성될 때 NOW()로 초기화되고 이후에 변경되지 않는 DATETIME 열을 사용하는 것입니다.
TIMESTAMP 값은 1970년 초부터 1초 단위로 2037년 부분까지 다양할 수 있습니다. 값은 숫자로 표시됩니다.
MySQL이 TIMESTAMP 값을 검색하고 표시하는 형식은 표 1과 같이 표시 너비에 따라 다릅니다. 4.3. 전체 TIMESTAMP 형식은 14자리이지만 TIMESTAMP 열은 더 짧은 표시 형식으로 정의할 수 있습니다.

너비에 대한 표시 형식의 표 종속성

모든 TIMESTAMP 열은 표시 형식에 관계없이 동일한 저장소 크기를 갖습니다. 가장 일반적으로 사용되는 형식은 6, 8, 12 및 14자입니다. 표를 생성할 때 임의의 표시 크기를 지정할 수 있지만 0과 14보다 큰 값은 14로 변환됩니다. 1부터 13까지의 홀수 값은 다음으로 높은 짝수 값으로 변환됩니다.
TIMESTAMP 열은 표시 너비에 관계없이 지정된 전체 정밀도를 사용하여 올바른 값을 저장합니다. 그러나 이와 관련된 몇 가지 제한 사항이 있습니다.

  1. 열이 TIMESTAMP(4) 또는 TIMESTAMP(2)로 선언된 경우에도 항상 연도, 월, 일을 지정해야 합니다. 그렇지 않으면 값이 유효하지 않은 것으로 간주되어 0이 저장됩니다.
  2. 사용하는 경우 ALTER 테이블 TIMESTAMP 열을 확장하려면 이전에 숨겨져 있던 정보가 강조 표시됩니다.
  3. 마찬가지로 TIMESTAMP 열을 좁힐 때 이전보다 더 적은 정보가 표시된다는 점을 제외하고는 정보가 손실되지 않습니다.
  4. TIMESTAMP 열은 전체 정밀도로 저장되지만 저장된 정보의 전체 양에 대해 작동하는 유일한 함수는 UNIX_TIMESTAMP()입니다. 다른 모든 함수는 형식이 지정된 검색된 값에서 작동합니다. 즉, 해당 부분이 열의 형식화된 값에 포함되어 있지 않으면 HOUR() 또는 SECOND()와 같은 함수를 사용할 수 없습니다. 예를 들어, TIMESTAMP 열의 HH 부분은 표시 너비가 최소 10이 아니면 표시되지 않으므로 더 짧은 TIMESTAMP 값에 HOURO를 사용하면 의미 없는 결과가 생성됩니다.
MySQL 버전 4.1 이상의 TIMESTAMP 속성
MySQL 4.1부터 TIMESTAMP 속성은 이전 릴리스의 속성과 다릅니다. TIMESTAMP 열은 DATETIME 열과 동일한 형식으로 나타납니다.
  • 디스플레이 너비는 이전에 설명한 대로 더 이상 지원되지 않습니다. 즉, 더 이상 TIMESTAMP(4) 또는 TIMESTAMP(2)를 사용할 수 없습니다. 또한 MySQL 서버가 MAXDB 모드에서 실행 중인 경우 TIMESTAMP 유형은 datetime과 동일합니다. 즉, 테이블이 생성되는 시점에 서버가 MAXDB 모드로 실행 중이라면 모든 TIMESTAMP 컬럼은 DATETIME으로 생성된다. 결과적으로 이러한 열은 DATETIME 표시 형식을 사용하고 유효한 값의 범위가 동일하며 자동 업데이트일어나지 않는다.
MySQL 서버는 버전 4.1.1부터 MAXDB 모드에서 실행할 수 있습니다. 이 모드를 활성화하려면 서버 시작 시 -sql-mode=MAXDB 옵션을 지정하거나 런타임 시 sqljnode 전역 변수를 설정하십시오.
mysql SET GLOBAL sql_mode=MAXDB;
클라이언트는 다음 명령을 사용하여 서버가 자체 세션에 대해 MAXDB 모드에서 실행되도록 할 수 있습니다.
mysql SET 세션 sql_mode=MAXDB;

먼저 각 유형에 대한 간략한 설명:

  • TIMESTAMP는 날짜 및 시간을 저장하기 위한 데이터 유형입니다. 데이터는 "Unix epoch"가 시작된 이후 경과된 시간(초)으로 저장됩니다. 값 범위: 1970-01-01 00:00:00 - 2038-12-31 00:00:00 4바이트를 차지합니다.
  • YEAR는 연도를 저장하기 위한 데이터 유형입니다. 값 범위: 1901 - 2155. 1바이트를 차지합니다.
  • DATE는 날짜를 저장하기 위한 데이터 유형입니다. 값 범위: 1000-01-01 - 9999-12-31. 3바이트를 차지합니다.
  • TIME은 시간을 저장하기 위한 자료형이다. 값 범위: -828:59:59 - 828:59:59. 3바이트를 차지합니다.
  • DATETIME은 날짜와 시간을 저장하기 위한 데이터 타입이다. 값 범위: 1000-01-01 00:00:00 - 9999-12-31 00:00:00 8바이트를 차지합니다.

소유자에 대한 참고 사항. 흥미롭게도 대부분의 프로그래머는 "타임스탬프"의 개념이 Unix 시간이라고 가정합니다. 사실 타임스탬프는 특정 이벤트가 발생한 날짜 및/또는 시간을 나타내는 일련의 문자인 레이블입니다. 그리고 Unix 시간(Unix 시간) 또는 POSIX 시간은 1970년 1월 1일 자정(UTC) 이후 경과한 초 수입니다. 타임스탬프의 개념은 Unix 시간보다 더 넓습니다.

위에 제시된 유형에 대한 설명을 분석한 후 특정 유형의 장단점에 대한 거의 모든 결론을 도출할 수 있습니다. 모든 것이 매우 간단하고 분명합니다.

그러나 이러한 유형의 사용에 대해 이야기하기 전에 실제로 다른 유형이 날짜와 시간을 저장하는 데 자주 사용된다는 점에 유의하고 싶습니다. 정수 값(날짜 저장용 - INT(4바이트), 날짜 및 시간 - BIGINT(8바이트) )). 정수 유형 사용과 DATE 및 DATETIME 간의 유일한 차이점은 데이터가 출력 중에 형식화되지 않고 날짜 및 시간을 사용하는 계산에서 정수를 적절한 달력 유형으로 변환해야 한다는 것입니다. 또한 저장하기 전에 제출된 값에 대한 유효성 검사가 수행되지 않습니다. 정렬 옵션이 유지됩니다. 따라서 DBMS와의 이식성과 독립성을 극대화하기 위해서는 DATE, DATETIME과 같은 경우에 INT와 BIGINT를 사용하는 것이 합리적이다. 나는 다른 이점을 보지 못했으며, 있다면 의견에 표시 할 것을 제안합니다.

MySQL에서 캘린더 데이터 유형 사용

가장 간단한 유형부터 시작하겠습니다. 년도. 유일한 장점은 크기가 1바이트에 불과하다는 것입니다. 그러나 이 때문에 유효한 값의 범위에 엄격한 제한이 있습니다(유형은 255개만 저장할 수 있습니다. 다른 값). 1901년에서 2155년 사이의 범위에서 연도를 엄격하게 저장하려는 실제 상황을 상상하기 어렵습니다. 또한 SMALLINT 유형(2바이트)은 대부분의 상황에서 연도를 저장하기에 충분한 범위를 제공합니다. 그리고 데이터베이스 테이블에 줄당 1바이트를 저장하는 것은 우리 시대에는 의미가 없습니다.

유형 데이트그리고 날짜 시간하나의 그룹으로 결합될 수 있습니다. 그들은 서버에 설정된 시간대에 관계없이 상당히 넓은 범위의 유효한 값으로 날짜 또는 날짜 및 시간을 저장합니다. 그들의 사용은 확실히 실용적입니다. 그러나 우리 시대로 거슬러 올라가는 역사적 사건의 날짜를 저장하려면 다른 데이터 유형을 선택해야 합니다. TIMESTAMP 유형(생일, 제품 출시 날짜, 대통령 선거, 우주 로켓 발사 등)의 범위를 잠재적으로 벗어날 수 있는 이벤트 날짜를 저장하려면 이러한 유형이 좋습니다. 이러한 유형을 사용할 때 염두에 두어야 할 한 가지 중요한 뉘앙스, 그러나 아래에서 더 자세히 설명합니다.

유형 시각 1초 미만의 정밀도가 필요하지 않은 기간과 829시간 미만의 기간을 저장하는 데 사용할 수 있습니다. 여기에 더 추가할 것은 없습니다.

가장 흥미로운 유형이 남아 있습니다. 타임스탬프. DATE 및 DATETIME과 비교하여 고려해야 합니다. TIMESTAMP는 또한 특정 이벤트가 발생한 날짜 및/또는 시간을 저장하도록 설계되었습니다. 그들 사이의 중요한 차이점은 값의 범위에 있다는 것입니다. 분명히 TIMESTAMP는 과거 이벤트(생일 등)를 저장하는 데 적합하지 않지만 현재 이벤트(로깅, 기사 게시 날짜, 제품 추가, 주문하기)를 저장하는 데는 좋습니다. ) 및 예측 가능한 미래의 예정된 이벤트 향후 이벤트(새 버전의 릴리스, 캘린더 및 플래너 등).

TIMESTAMP 유형을 사용하는 주요 편의성은 테이블에서 이 유형의 열에 대해 현재 시간을 대체하는 형태로 기본값을 설정할 수 있을 뿐만 아니라 레코드를 업데이트할 때 현재 시간을 설정할 수 있다는 것입니다. 이러한 기능이 필요한 경우 99%의 확률로 TIMESTAMP가 정확히 필요한 것입니다. (이 작업을 수행하는 방법은 설명서를 참조하십시오.)

2038년이 다가옴에 따라 귀하의 소프트웨어가 작동을 멈출 것이라고 두려워하지 마십시오. 첫째, 그 전에 소프트웨어 사용이 중단될 가능성이 높습니다(특히 현재 작성 중인 버전). 둘째, 이 날짜가 다가옴에 따라 MySQL 개발자는 소프트웨어를 계속 작동시킬 수 있는 방법을 확실히 제시할 것입니다. Y2K 문제뿐만 아니라 모든 것이 해결됩니다.

그래서 우리는 TIMESTAMP 유형을 사용하여 우리 시대의 사건의 날짜와 시간을 저장하고 DATETIME 및 DATE - 역사적 사건 또는 깊은 미래의 사건의 날짜와 시간을 저장합니다.

값 범위는 TIMESTAMP, DATETIME 및 DATE 유형 간의 중요한 차이점이지만 주요 유형은 아닙니다. 중요한 것은 TIMESTAMP는 값을 UTC로 저장합니다. 값을 저장할 때 현재 시간대에서 UTC로 변환하고 읽을 때 UTC에서 현재 시간대로 변환합니다. DATETIME 및 DATE는 시간대에 관계없이 항상 동일한 시간을 저장하고 표시합니다.

시간대는 MySQL DBMS에서 전역적으로 설정되거나 현재 연결에 대해.후자는 DBMS 수준에서 다른 시간대의 다른 사용자의 작업을 보장하는 데 사용할 수 있습니다. 모든 시간 값은 물리적으로 UTC로 저장되고 클라이언트로부터 수신되어 클라이언트에게 제공됩니다. 그러나 TIMESTAMP 데이터 유형을 사용하는 경우에만. DATE 및 DATETIME은 항상 동일한 값을 사용하고 저장하고 반환합니다.

NOW() 함수와 그 동의어는 사용자의 현재 시간대에 있는 시간 값을 반환합니다.

이러한 모든 상황을 감안할 때 서버 연결 내에서 시간대를 변경하고 DATE 및 DATETIME 유형을 사용할 때 각별히 주의해야 합니다. 날짜(예: 생년월일)를 저장해야 하는 경우 문제가 없습니다. 모든 지역의 생년월일은 동일합니다. 저것들. 1월 1일 0:00 UTC / GMT + 0에 태어났다면 이것은 ~ 아니다미국에서는 12월 31일에 생일을 축하한다는 의미입니다. 하지만 유지를 선택하면 시각이벤트가 DATETIME 열에 있으면 DBMS 수준의 사용자 시간대에서는 작동하지 않습니다. 예를 들어 설명하겠습니다.

사용자 X는 UTC/GMT+2 영역에서 작동하고 Y - UTC/GMT+3 영역에서 작동합니다. MySQL에 대한 사용자 연결의 경우 해당(각각 고유한) 시간대가 설정됩니다. 사용자가 포럼에 메시지를 게시하면 메시지가 작성된 날짜에 관심이 있습니다.

옵션 1: DATETIME. 사용자 X가 14:00 UTC/GMT+2에 메시지를 작성합니다. 메시지의 "날짜" 필드 값은 NOW() 함수 실행 결과로 대체됩니다(14:00). 사용자 Y는 메시지가 작성된 시간을 읽고 동일한 14:00을 봅니다. 하지만 그는 자신의 설정에 UTC/GMT + 3 영역이 있고, 그는 메시지가 바로 지금이 아니라 한 시간 전에 작성되었다고 생각합니다.

옵션 2: 타임스탬프. 사용자 X가 14:00 UTC/GMT+2에 메시지를 작성합니다. "날짜" 필드에는 NOW() 함수 실행 결과가 포함됩니다. 이 경우- 12:00 UTC/GMT+0. UserY는 메시지가 작성된 시간을 읽고 (UTC/GMT+3)(12:00 UTC/GMT+0) = 15:00 UTC/GMT+3을 얻습니다. 모든 것이 우리가 원하는 대로 정확하게 나타납니다. 그리고 가장 중요한 것은 사용이 매우 편리하다는 것입니다. 사용자 지정 시간대를 지원하기 위해 시간 변환 코드를 작성할 필요가 없습니다.

현재 시간을 대체하고 TIMESTAMP 유형의 시간대를 사용할 수 있는 가능성은 매우 강력하여 일부 로그에 시간 없이 날짜를 저장해야 하는 경우 1바이트 차이를 저장하지 않고 DATE 대신 TIMESTAMP를 계속 사용해야 합니다. 동시에 "00:00:00"은 무시하십시오.

값의 범위가 상대적으로 작아 TIMESTAMP를 사용할 수 없는 경우(일반적으로 사이트 데이터베이스에서 10-15에 대해 1-2 사례임) DATETIME을 사용하고 값을 신중하게 조정해야 합니다. ​​올바른 위치에(즉, 이 필드에 쓸 때 날짜를 UTC로 변환하고 읽을 때 - 읽는 사용자 영역의 시간으로). 날짜만 저장하는 경우 시간대는 중요하지 않을 수 있습니다. 새해모두가 현지 시간으로 1월 1일을 기념하므로 여기에서 아무 것도 번역할 필요가 없습니다.

YEAR, TIME, TIMESTAMP, DATE 및 DATETIME 날짜 및 시간에는 사용자가 실제로 잘못된 값을 입력할 때 사용되는 "0" 값을 포함하여 고유한 유효한 값 범위가 있습니다.

MySQL은 1999-11-31과 같이 완전히 유효하지 않은 일부 날짜 값을 저장할 수 있습니다. 그 이유는 날짜 유효성 검사를 관리하는 것은 SQL 서버가 아니라 애플리케이션에 달려 있기 때문입니다. 날짜 유효성 검사 속도를 높이기 위해 MySQL은 월이 0-12 사이이고 일이 0-31 사이인지 확인합니다. 이 범위는 0에서 시작하므로 MySQL은 DATETIME 또는 DATE 열에 일과 월이 0인 날짜를 저장할 수 있습니다. 그런 다음 날짜는 1999-00-00 또는 1999-01-00으로 저장됩니다(이러한 날짜의 경우 DATE_ADD 또는 DATE_SUB() 함수가 잘못된 값을 제공할 수 있음).

MySQL은 값을 여러 형식으로 해석하지만 날짜는 항상 년-월-일 순서로 제공되어야 합니다(예: "99-08-05"). 날짜 또는 시간 유형이 있는 값은 주어진 값이 숫자로 사용될 때 MySQL에 의해 자동으로 숫자로 변환되며 그 반대의 경우도 마찬가지입니다.

날짜 또는 시간 유형이고 지정된 범위를 벗어나거나 유효하지 않은 값 이 유형의데이터, MySQL은 값 "0"으로 변환합니다. 예외는 지정된 간격을 넘어 지정된 TIME 간격의 경계 지점까지 잘린 TIME 값입니다.

이 표에서는 각 열 유형에 대한 "null" 값의 형식을 설명합니다.

데이터 유형에 대한 2000년 문제

MySQL은 Y2K에 강하지만 일부 입력 값은 오류의 원인이 될 수 있습니다. 예를 들어, 두 자리 연도 값을 입력하면 모호하게 해석됩니다. 세기가 지정되지 않았습니다. MySQL은 4자리 숫자를 사용하여 연도를 나타내므로 이러한 값은 4자리 숫자로 변환해야 합니다.

YEAR, TIMESTAMP, DATE 및 DATETIME 유형에 대해 MySQL에서 연도가 모호한 날짜는 다음 규칙에 따라 해석됩니다.

  • 00에서 69 사이의 연도 값은 2000-2069로 변환됩니다.
  • 70과 99 사이의 연도 값은 1970-1999로 변환됩니다.

타임스탬프를 입력하세요.

TIMESTAMP 유형은 다음을 제공합니다. 자동 녹음 INSERT 또는 UPDATE 작업을 사용할 때 현재 날짜 및 시간입니다. 여러 TIMESTAMP 열을 사용하는 경우 첫 번째 열만 자동으로 업데이트됩니다.

날짜 유형

DATE 유형에는 "YYYY-MM-DD" 형식의 날짜 정보가 있는 값이 포함됩니다. 이 유형의 경우 연도는 1000-9999 범위 내에서 달라질 수 있으며 월 및 일 값은 연도 내에서 달라질 수 있습니다. 저것들. 데이터는 "1000-01-01"-"9999-12-31" 범위에서 처리됩니다.

DATETIME 유형

DATETIME 유형은 날짜 및 시간 값을 포함하는 값에 사용됩니다. MySQL은 "1000-01-01 00:00:00" - "9999-12-31 23:59:59" 범위에 해당하는 "YYYY-MM-DD HH:MM:SS" 형식의 값을 처리합니다. .

유형 시간

MySQL은 이 유형의 값을 "HH:MM:SS" 형식으로 처리합니다. 더 큰 시간 값의 경우(시간 간격을 지정할 때) "HHH:MM:SS" 형식이 사용됩니다. TIME 값은 "-838:59:59"와 "838:59:59" 사이여야 합니다.

연도 유형

YEAR 데이터 유형은 단일 바이트이며 연도 값을 포함합니다.

MySQL은 YYYY 형식의 값을 처리하며 범위는 1901~2155입니다.

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

따라서 모든 달력 데이터 유형은 섹션 “10.3. 날짜 및 시간 유형 » MySQL 매뉴얼. 하지만 중요한 정보, 표준 시간대의 DBMS 지원에 대해서는 “9.7. MySQL 서버 시간대 지원. 다음의 모든 것은 매뉴얼 연구를 기반으로 합니다. 동시에 하나 또는 다른 유형을 선택하는 뉘앙스 만 여기에 표시되므로이 자료는 어떤 식 으로든 매뉴얼을 대체하지는 않지만 보완합니다.

먼저 각 유형에 대한 간략한 설명:

  • TIMESTAMP는 날짜 및 시간을 저장하기 위한 데이터 유형입니다. 데이터는 "Unix epoch"가 시작된 이후 경과된 시간(초)으로 저장됩니다. 값 범위: 1970-01-01 00:00:00 - 2038-12-31 00:00:00 4바이트를 차지합니다.
  • YEAR는 연도를 저장하기 위한 데이터 유형입니다. 값 범위: 1901 - 2155. 1바이트를 차지합니다.
  • DATE는 날짜를 저장하기 위한 데이터 유형입니다. 값 범위: 1000-01-01 - 9999-12-31. 3바이트를 차지합니다.
  • TIME은 시간을 저장하기 위한 자료형이다. 값 범위: -828:59:59 - 828:59:59. 3바이트를 차지합니다.
  • DATETIME은 날짜와 시간을 저장하기 위한 데이터 타입이다. 값 범위: 1000-01-01 00:00:00 - 9999-12-31 00:00:00 8바이트를 차지합니다.
소유자에 대한 참고 사항. 흥미롭게도 대부분의 프로그래머는 "타임스탬프"의 개념이 Unix 시간이라고 가정합니다. 사실 타임스탬프는 특정 이벤트가 발생한 날짜 및/또는 시간을 나타내는 일련의 문자인 레이블입니다. 그리고 Unix 시간(Unix 시간) 또는 POSIX 시간은 1970년 1월 1일 자정(UTC) 이후 경과한 초 수입니다. 타임스탬프의 개념은 Unix 시간보다 더 넓습니다.

위에 제시된 유형에 대한 설명을 분석한 후 특정 유형의 장단점에 대한 거의 모든 결론을 도출할 수 있습니다. 모든 것이 매우 간단하고 분명합니다.

그러나 이러한 유형의 사용에 대해 이야기하기 전에 실제로 다른 유형이 날짜와 시간을 저장하는 데 자주 사용된다는 점에 유의하고 싶습니다. 정수 값(날짜 저장용 - INT(4바이트), 날짜 및 시간 - BIGINT(8바이트) )). 정수 유형 사용과 DATE 및 DATETIME 간의 유일한 차이점은 데이터가 출력 중에 형식화되지 않고 날짜 및 시간을 사용하는 계산에서 정수를 적절한 달력 유형으로 변환해야 한다는 것입니다. 또한 저장하기 전에 제출된 값에 대한 유효성 검사가 수행되지 않습니다. 정렬 옵션이 유지됩니다. 따라서 DBMS와의 이식성과 독립성을 극대화하기 위해서는 DATE, DATETIME과 같은 경우에 INT와 BIGINT를 사용하는 것이 합리적이다. 나는 다른 이점을 보지 못했으며, 있다면 의견에 표시 할 것을 제안합니다.

MySQL에서 캘린더 데이터 유형 사용

가장 간단한 유형부터 시작하겠습니다. 년도. 유일한 장점은 크기가 1바이트에 불과하다는 것입니다. 그러나 이 때문에 유효한 값의 범위에 엄격한 제한이 있습니다(유형은 255개의 다른 값만 저장할 수 있음). 1901년에서 2155년 사이의 범위에서 연도를 엄격하게 저장하려는 실제 상황을 상상하기 어렵습니다. 또한 SMALLINT 유형(2바이트)은 대부분의 상황에서 연도를 저장하기에 충분한 범위를 제공합니다. 그리고 데이터베이스 테이블에 줄당 1바이트를 저장하는 것은 우리 시대에는 의미가 없습니다.

유형 데이트그리고 날짜 시간하나의 그룹으로 결합될 수 있습니다. 그들은 서버에 설정된 시간대에 관계없이 상당히 넓은 범위의 유효한 값으로 날짜 또는 날짜 및 시간을 저장합니다. 그들의 사용은 확실히 실용적입니다. 그러나 우리 시대로 거슬러 올라가는 역사적 사건의 날짜를 저장하려면 다른 데이터 유형을 선택해야 합니다. TIMESTAMP 유형(생일, 제품 출시 날짜, 대통령 선거, 우주 로켓 발사 등)의 범위를 잠재적으로 벗어날 수 있는 이벤트 날짜를 저장하려면 이러한 유형이 좋습니다. 이러한 유형을 사용할 때 한 가지 중요한 뉘앙스를 고려해야 하지만 아래에서 자세히 설명합니다.

유형 시각 1초 미만의 정밀도가 필요하지 않은 기간과 829시간 미만의 기간을 저장하는 데 사용할 수 있습니다. 여기에 더 추가할 것은 없습니다.

가장 흥미로운 유형이 남아 있습니다. 타임스탬프. DATE 및 DATETIME과 비교하여 고려해야 합니다. TIMESTAMP는 또한 특정 이벤트가 발생한 날짜 및/또는 시간을 저장하도록 설계되었습니다. 그들 사이의 중요한 차이점은 값의 범위에 있다는 것입니다. 분명히 TIMESTAMP는 과거 이벤트(생일 등)를 저장하는 데 적합하지 않지만 현재 이벤트(로깅, 기사 게시 날짜, 제품 추가, 주문하기)를 저장하는 데는 좋습니다. ) 및 예측 가능한 미래의 예정된 이벤트 향후 이벤트(새 버전의 릴리스, 캘린더 및 플래너 등).

TIMESTAMP 유형을 사용하는 주요 편의성은 테이블에서 이 유형의 열에 대해 현재 시간을 대체하는 형태로 기본값을 설정할 수 있을 뿐만 아니라 레코드를 업데이트할 때 현재 시간을 설정할 수 있다는 것입니다. 이러한 기능이 필요한 경우 99%의 확률로 TIMESTAMP가 정확히 필요한 것입니다. (이 작업을 수행하는 방법은 설명서를 참조하십시오.)

2038년이 다가옴에 따라 귀하의 소프트웨어가 작동을 멈출 것이라고 두려워하지 마십시오. 첫째, 그 전에 소프트웨어 사용이 중단될 가능성이 높습니다(특히 현재 작성 중인 버전). 둘째, 이 날짜가 다가옴에 따라 MySQL 개발자는 소프트웨어를 계속 작동시킬 수 있는 방법을 확실히 제시할 것입니다. Y2K 문제뿐만 아니라 모든 것이 해결됩니다.

그래서 우리는 TIMESTAMP 유형을 사용하여 우리 시대의 사건의 날짜와 시간을 저장하고 DATETIME 및 DATE - 역사적 사건 또는 깊은 미래의 사건의 날짜와 시간을 저장합니다.

값 범위는 TIMESTAMP, DATETIME 및 DATE 유형 간의 중요한 차이점이지만 주요 유형은 아닙니다. 중요한 것은 TIMESTAMP는 값을 UTC로 저장합니다. 값을 저장할 때 현재 시간대에서 UTC로 변환하고 읽을 때 UTC에서 현재 시간대로 변환합니다. DATETIME 및 DATE는 시간대에 관계없이 항상 동일한 시간을 저장하고 표시합니다.

시간대는 MySQL DBMS에서 전역적으로 설정되거나 현재 연결에 대해.후자는 DBMS 수준에서 다른 시간대의 다른 사용자의 작업을 보장하는 데 사용할 수 있습니다. 모든 시간 값은 물리적으로 UTC로 저장되고 클라이언트로부터 수신되어 클라이언트에게 제공됩니다. 그러나 TIMESTAMP 데이터 유형을 사용하는 경우에만. DATE 및 DATETIME은 항상 동일한 값을 사용하고 저장하고 반환합니다.

NOW() 함수와 그 동의어는 사용자의 현재 시간대에 있는 시간 값을 반환합니다.

이러한 모든 상황을 감안할 때 서버 연결 내에서 시간대를 변경하고 DATE 및 DATETIME 유형을 사용할 때 각별히 주의해야 합니다. 날짜(예: 생년월일)를 저장해야 하는 경우 문제가 없습니다. 모든 지역의 생년월일은 동일합니다. 저것들. 1월 1일 0:00 UTC / GMT + 0에 태어났다면 이것은 ~ 아니다미국에서는 12월 31일에 생일을 축하한다는 의미입니다. 하지만 유지를 선택하면 시각이벤트가 DATETIME 열에 있으면 DBMS 수준의 사용자 시간대에서는 작동하지 않습니다. 예를 들어 설명하겠습니다.

사용자 X는 UTC/GMT+2 영역에서 작동하고 Y - UTC/GMT+3 영역에서 작동합니다. MySQL에 대한 사용자 연결의 경우 해당(각각 고유한) 시간대가 설정됩니다. 사용자가 포럼에 메시지를 게시하면 메시지가 작성된 날짜에 관심이 있습니다.

옵션 1: DATETIME. 사용자 X가 14:00 UTC/GMT+2에 메시지를 작성합니다. 메시지의 "날짜" 필드 값은 NOW() 함수 실행 결과로 대체됩니다(14:00). 사용자 Y는 메시지가 작성된 시간을 읽고 동일한 14:00을 봅니다. 하지만 그는 자신의 설정에 UTC/GMT + 3 영역이 있고, 그는 메시지가 바로 지금이 아니라 한 시간 전에 작성되었다고 생각합니다.

옵션 2: 타임스탬프. 사용자 X가 14:00 UTC/GMT+2에 메시지를 작성합니다. "날짜" 필드에는 NOW() 함수 실행 결과가 포함됩니다(이 경우 12:00 UTC/GMT+0). UserY는 메시지가 작성된 시간을 읽고 (UTC/GMT+3)(12:00 UTC/GMT+0) = 15:00 UTC/GMT+3을 얻습니다. 모든 것이 우리가 원하는 대로 정확하게 나타납니다. 그리고 가장 중요한 것은 사용이 매우 편리하다는 것입니다. 사용자 지정 시간대를 지원하기 위해 시간 변환 코드를 작성할 필요가 없습니다.

현재 시간을 대체하고 TIMESTAMP 유형의 시간대를 사용할 수 있는 가능성은 매우 강력하여 일부 로그에 시간 없이 날짜를 저장해야 하는 경우 1바이트 차이를 저장하지 않고 DATE 대신 TIMESTAMP를 계속 사용해야 합니다. 동시에 "00:00:00"은 무시하십시오.

값의 범위가 상대적으로 작아 TIMESTAMP를 사용할 수 없는 경우(일반적으로 사이트 데이터베이스에서 10-15에 대해 1-2 사례임) DATETIME을 사용하고 값을 신중하게 조정해야 합니다. ​​올바른 위치에(즉, 이 필드에 쓸 때 날짜를 UTC로 변환하고 읽을 때 - 읽는 사용자 영역의 시간으로). 날짜만 저장하는 경우 시간대는 중요하지 않습니다. 모든 사람이 현지 시간인 1월 1일에 새해를 축하하므로 여기에서 아무 것도 번역할 필요가 없습니다.

데이터 유형 날짜, 시간 및 날짜/시간날짜, 시간 및 날짜와 시간을 동시에 저장하는 데 사용됩니다. 날짜와 시간을 문자열로 저장하지 않고 이 목적을 위한 데이터 형식 중 하나로 저장하는 것이 훨씬 더 편리합니다. 이러한 방식으로 날짜와 시간을 저장하면 표시하기가 더 쉽습니다. SQL 서버자동으로 친숙한 형식을 제공합니다. 이러한 데이터 유형에 대한 날짜 및 시간 값을 처리하기 위해 특수 함수를 사용할 수도 있습니다.

날짜와 시간을 char, varchar 또는 숫자 데이터 유형 중 하나의 값으로 저장하면 당연히 화면에 표시될 때 형식이 우리에게 익숙한 것과는 거리가 멀게 나타납니다. .

모든 설정("기본값")은 서버 설정에 따라 다릅니다.따라서 데이터베이스에 데이터를 입력하기 전에 서버 설정을 확인해야 합니다. .

유형 날짜 시간. 테이블 열 15.04.00 13:05에 저장할 날짜와 시간을 지정할 수 있습니다.

날짜/시간 데이터로 저장된 값을 표시하기 위해 가장 일반적인(기본값) 형식은 D MMMM YYYY 'y'(또는 줄여서 D.MM.YY) H:mm:ss, 예를 들어 2000년 6월 12일(또는 12.06.00) 22:33:50 . INSERT 문 또는 다른 문에서 datetime 유형의 값을 사용할 때는 다음과 같이 입력해야 합니다. 작은따옴표. SQL Server는 한 값을 다른 값과 구별하고 모든 것을 원래대로 저장할 수 있기 때문에 날짜를 먼저 입력한 다음 시간을 입력하거나 그 반대의 경우도 가능합니다.

날짜의 datetime형 값을 입력할 때 대문자와 소문자를 모두 사용할 수 있으며 월, 일, 연도 사이에 하나 이상의 공백을 포함할 수 있습니다.

날짜 입력 가능 다른 방법들. SQL Server는 각 날짜 형식을 인식하고 값을 올바르게 저장합니다. 월 약어 또는 전체 월 이름을 사용하여 알파벳 형식으로 날짜를 입력할 수 있습니다. 일, 월, 연도 사이에 점이나 슬래시를 넣습니다.

연도의 세기 부분을 생략하면 50보다 작은 10년은 21세기로 표시되고 50보다 큰 10년은 20세기로 표시됩니다. 날짜에 숫자가 누락된 경우 연도를 완전히 입력해야 합니다. 숫자 없이 날짜를 입력하면 이 값은 첫 번째 숫자(기본값)와 같습니다.

시간은 시, 분, 초, 밀리초(설정에서 사용 가능한 경우)의 순서로 입력해야 합니다. 시간 블록 사이에는 반드시 구분 기호(콜론)를 넣어야 합니다. 입력한 숫자를 날짜가 아닌 시간으로 인식해야 합니다.

다음 표는 datetime형 값에서 날짜와 시간에 대한 다양한 해석을 보여줍니다.