[mysql] MySQL에서 datetime 또는 timestamp 데이터 형식을 사용해야합니까?

datetime 또는 timestamp 필드를 사용하는 것이 좋으며 왜 MySQL을 사용합니까?

서버 측에서 PHP로 작업하고 있습니다.



답변

MySQL의 타임 스탬프는 일반적으로 레코드 변경 사항을 추적하는 데 사용되며 종종 레코드가 변경 될 때마다 업데이트됩니다. 특정 값을 저장하려면 날짜 시간 필드를 사용해야합니다.

UNIX 타임 스탬프 또는 기본 MySQL 날짜 / 시간 필드 사용 여부를 결정하려면 기본 형식을 사용하십시오. 이런 식으로 MySQL 내에서 계산을 수행 할 수
있으며 PHP로 레코드를 조작하려는 경우 레코드를 쿼리 할 때 ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")값 형식을 UNIX 타임 스탬프로 변경하는 것이 간단합니다 ("SELECT UNIX_TIMESTAMP(my_datetime)").


답변

MySQL 5 이상에서 TIMESTAMP 값은 저장을 위해 현재 시간대에서 UTC로 변환되고 검색을 위해 UTC에서 현재 시간대로 다시 변환됩니다. (이는 TIMESTAMP 데이터 유형에만 발생 하며 DATETIME과 같은 다른 유형 에는 발생 하지 않습니다 .)

기본적으로 각 연결의 현재 시간대는 서버의 시간입니다. 시간대는 MySQL 서버 시간대 지원에 설명 된대로 연결별로 설정할 수 있습니다 .


답변

나는 항상 행 메타 데이터 (날짜 생성 또는 수정) 이외의 다른 것에 대해 DATETIME 필드를 사용합니다.

으로 언급 은 MySQL 문서 :

DATETIME 유형은 날짜 및 시간 정보가 모두 포함 된 값이 필요할 때 사용됩니다. MySQL은 ‘YYYY-MM-DD HH : MM : SS’형식으로 DATETIME 값을 검색하고 표시합니다. 지원되는 범위는 ‘1000-01-01 00:00:00’~ ‘9999-12-31 23:59:59’입니다.

TIMESTAMP 데이터 유형의 범위는 ‘1970-01-01 00:00:01’UTC에서 ‘2038-01-09 03:14:07’UTC입니다. MySQL 버전과 서버가 실행중인 SQL 모드에 따라 다양한 속성이 있습니다.

생년월일 저장과 같이 일반적으로 사용되는 TIMESTAMP의 하한에 도달 할 가능성이 높습니다.


답변

아래 예제 TIMESTAMPtime-zone to 'america/new_york'위치 DATETIME가 변경되지 않은 후 날짜 유형이 값을 어떻게 변경 했는지 보여줍니다 .

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

더 많은 사람들이이 유용한 MySQL을 찾을 수 있도록 내 답변을 기사로 변환했습니다 . Datetime vs. Timestamp Data Types .


답변

주요 차이점은 DATETIME은 일정하고 TIMESTAMP는 time_zone설정의 영향을받는 것 입니다.

따라서 시간대에 따라 클러스터를 동기화했거나 앞으로있을 수있는 경우에만 중요합니다.

간단히 말해서 : 호주에 데이터베이스가 있고 미국에서 데이터베이스를 동기화 / 채우기 위해 해당 데이터베이스를 덤프하면 TIMESTAMP는 새 시간대의 이벤트 실시간을 반영하도록 업데이트되지만 DATETIME은 여전히 au 시간대의 이벤트 시간을 반영합니다 .

TIMESTAMP가 사용 된 곳에서 사용되는 DATETIME의 좋은 예는 Facebook에서 서버가 시간대 전체에서 발생한 시간을 확실하게 알 수없는 Facebook입니다. 한때 나는 대화가 있었는데 메시지가 실제로 전송되기 전에 메시지에 답장을했다. 물론 시간이 동기화되지 않고 게시 된 경우 메시징 소프트웨어의 시간대 변환이 잘못되어 발생할 수도 있습니다.


답변

나는이 결정을 시맨틱 기반으로한다.

고정 된 특정 시점을 기록해야 할 때 타임 스탬프를 사용합니다. 예를 들어 레코드가 데이터베이스에 삽입되었거나 일부 사용자 작업이 발생한 경우입니다.

날짜 / 시간을 임의로 설정하고 변경할 수있는 날짜 / 시간 필드를 사용합니다. 예를 들어, 사용자가 나중에 변경 약속을 저장할 수있는 경우.


답변

DATETIME 또는 TIMESTAMP 필드를 사용 하지 않는 것이 좋습니다 . 특정 날짜를 전체 생일 (예 : 생일)로 나타내려면 DATE 유형을 사용하십시오. 그러나 그보다 더 구체적인 경우에는 단위가 아닌 실제 순간을 기록하는 데 관심이있을 것입니다. 시간 (일, 주, 월, 년). DATETIME 또는 TIMESTAMP를 사용하는 대신 BIGINT를 사용하고 신기원 이후의 시간 (밀리 초)을 저장하십시오 (Java를 사용하는 경우 System.currentTimeMillis ()). 여기에는 몇 가지 장점이 있습니다.

  1. 벤더 잠금을 피하십시오. 거의 모든 데이터베이스는 비교적 비슷한 방식으로 정수를 지원합니다. 다른 데이터베이스로 이동한다고 가정하십시오. MySQL의 DATETIME 값과 Oracle이 값을 정의하는 방법의 차이점에 대해 걱정하고 싶습니까? 다른 버전의 MySQL 중에서도 TIMESTAMPS의 정밀도는 다릅니다. 최근에야 MySQL이 타임 스탬프에서 밀리 초를 지원했습니다.
  2. 시간대 문제가 없습니다. 데이터 유형이 다른 시간대에서 발생하는 일에 대한 통찰력있는 의견이 있습니다. 그러나이 상식은 무엇입니까? 동료가 배우는 데 시간이 걸리나요? 반면에 BigINT를 java.util.Date로 변경하는 것은 엉망입니다. BIGINT를 사용하면 시간대와 관련된 많은 문제가 발생합니다.
  3. 범위 나 정밀도에 대해 걱정할 필요가 없습니다. 미래의 날짜 범위에 따라 줄어드는 것에 대해 걱정할 필요가 없습니다 (TIMESTAMP는 2038로만 진행됨)
  4. 타사 도구 통합. 정수를 사용하면 써드 파티 도구 (예 : EclipseLink)가 데이터베이스와 인터페이스하는 것이 쉽지 않습니다. 모든 타사 도구가 MySQL과 “datetime”을 동일하게 이해하는 것은 아닙니다. 이러한 사용자 정의 데이터 유형을 사용하는 경우 java.sql.TimeStamp 또는 java.util.Date 객체를 사용해야하는지 Hibernate에서 알아 내고 싶습니까? 기본 데이터 유형을 사용하면 타사 도구를 사소하게 사용할 수 있습니다.

이 문제는 데이터베이스에 돈 값 (예 : $ 1.99)을 저장하는 방법과 밀접한 관련이 있습니다. Decimal 또는 데이터베이스의 Money 유형을 사용해야합니까 아니면 최악의 Double을 사용해야합니까? 이러한 옵션 중 세 가지 모두 위에 나열된 여러 가지 이유로 끔찍합니다. 해결책은 BIGINT를 사용하여 금액을 센트로 저장 한 다음 사용자에게 값을 표시 할 때 센트를 달러로 변환하는 것입니다. 데이터베이스의 임무는 데이터를 저장하고 해당 데이터를 해석하지 않는 것입니다. 데이터베이스 (특히 Oracle)에서 볼 수있는이 모든 멋진 데이터 유형은 거의 추가되지 않으며 벤더 잠금을 시작합니다.