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


2685

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

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


1
여기에는 관련 정보가 있습니다 codeproject.com/Tips/1215635/MySQL-DATETIME-vs-TIMESTAMP
Waqleh

2038 년 2 월에 응용 프로그램을 중단하려면 타임 스탬프를 사용하십시오. 날짜 범위를 확인하십시오.
Wilson Hauck

답변:


1829

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

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


981
중요한 차이점은 DATETIME날짜 (달력에서 볼 수 있음)와 시간 (벽시계에서 볼 수 있음)을 TIMESTAMP나타내는 반면 잘 정의 된 특정 시점 을 나타냅니다. 애플리케이션이 시간대를 처리하는 경우 매우 중요 할 수 있습니다. '2010-09-01 16:31:00'은 얼마나 되었습니까? 그것은 당신이 어느 시간대에 있는지에 달려 있습니다. 나에게 그것은 몇 초 전이었습니다. 왜냐하면 당신은 미래의 시간을 나타낼 수도 있습니다. '1970-01-01 00:00:00 UTC'이후 1283351460 초라고 말하면 정확히 어떤 시점에 대해 알고 있는지 알 수 있습니다. (아래 Nir의 탁월한 답변 참조). [단점 : 유효 범위].
MattBianco

121
또 다른 차이점은 "기본"날짜 시간이있는 쿼리는 캐시되지 않지만 타임 스탬프가있는 쿼리는 캐시됩니다.
OZ_

39
"MySQL의 타임 스탬프는 일반적으로 레코드 변경 사항을 추적하는 데 사용됩니다"이것이 좋은 대답이라고 생각하지 마십시오. 타임 스탬프는 MattBianco와 Nir이 말한 것보다 훨씬 강력하고 복잡합니다. 대답의 두 번째 부분은 매우 좋습니다. 생생한 말이 사실이며 좋은 조언입니다.
산티아고 바 술토

10
또한 DATETIME 및 TIMESTAMP는 CURRENT_TIMESTAMP, NOW ()를 기본값으로 신중하게 사용할 수 있지만 기본적으로 '0000-00-00'을 사용하기 때문에 DATE와 같이 사용할 수 없습니다. DATE mysql 유형의 필드 / 열에 현재 날짜를 시간없이 삽입하기 위해 해당 테이블에 대한 트리거.
Arthur Kushman

14
@DavidHarkness는 : 문서는 "CURRENT_TIMESTAMP 및 ON UPDATE CURRENT_TIMESTAMP 조항 기본값을 사용, 자동 속성을 지정하려면"라고 dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
PLAP

917

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

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


11
이 OReilly 프레젠테이션은이 주제에 매우 유용합니다 (PDF 미안) cdn.oreillystatic.com/en/assets/1/event/36/…
gcb

13
또한 이벤트의 성격에 관한 내용 :-화상 회의 (TIMESTAMP). 모든 교환 원은 시간대에 맞게 조정 된 절대 시간을 참조해야합니다. -현지 작업 시간 (DATETIME),이 작업을 2014/03/31 9:00 AM에해야합니다. 그 날 뉴욕이나 파리에서 일하고 있더라도 상관 없습니다. 현지 시간으로 오전 8시에 일을 시작합니다.
yucer

1
따라서 서버의 시간대를 변경하면 TIMESTAMP의 값이 동일하게 유지되거나 너무 변경됩니까?
Andrew

3
@Andrew는 UTC이므로 UTC를 유지합니다. 그러나 역변환은 "새"서버 시간대로 변경됩니다.
nembleton

@ yucer-그렇게 생각하지 않는 것이 좋습니다. 세계 경제에서 가장 일관된 사용법은 저장을 위해 모든 날짜 시간을 UTC로 변환하는 것입니다. 일반적으로 Datetime을 UTC 필드로 취급하십시오. 이것은 UTC로 변환하기 위해 날짜 시간을 입력하는 모든 작업에 부담을 주지만 장기적으로 더 깔끔한 디자인입니다. 물론 현재 설정에 따라 사용자에게 정보를 제공하십시오. "09:00 in Paris"를 입력하려면 Paris 시간을 설정 한 다음 09:00을 입력하십시오. 뉴욕에있는 모든 사람은 자신의 시간에 깨어나 전화 회의에 필요한 시간을 쉽게 찾을 수 있습니다.
ToolmakerSteve

524

나는 항상 행 메타 데이터 (날짜 생성 또는 수정) 이외의 다른 것에 대해 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의 하한에 도달 할 가능성이 높습니다.


195
당신은 또한 은행이나 부동산에있는 경우 쉽게 상한 을 칠 수 있습니다 ... 30 년 모기지 지금 2038을 넘어 간다
Kip

16
물론 64 비트 유닉스 타임 스탬프를 사용하십시오. 예를 들어, Java에서는 new Date().getTime()이미 64 비트 값을 제공합니다.
osa

5
DATETIME +1 : 구매 및 송장을위한 실제 저장소의 SQL Server에서 웹 페이지의 가상 저장소를 위해 MySQL 서버로 전송 된 데이터 흐름에서이 데이터 유형이 Transact에도 존재하므로 DATETIME이 수정 날짜-시간에 더 좋습니다 -SQL. 그러나 TIMESTAMP는 Transact-SQL의 다른 것을 의미하지만 MySQL TIMESTAMP는 DateTime과 비슷하지만 ROWVERSION과 같은 이진입니다. 따라서 두 DB의 호환성을 위해 TIMESTAMP를 사용하지 마십시오.
jacouh

10
몰라요. 그것은 단지 MySQL보다 훨씬 큰 문제이며 간단한 해결책 은 없습니다 : en.wikipedia.org/wiki/Year_2038_problem MySQL이 타임 스탬프를 64 비트로 선언하고 모든 것이 잘 될 것이라고 생각할 수는 없습니다. 하드웨어를 제어하지 않습니다.
scronide

5
내가하는 것처럼 생년월일을 알면 생년월일은 DATETIME이 될 수 있습니다.
Kris Craig

322

아래 예제 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 .


55
실제로 DATETIME시간대 변경에 따라 유효 시간이 TIMESTAMP변경되었지만 변경되지 않았지만 사람의 표현은 변경되었습니다.
flindeberg

3
이 명령은 MySQL 5.6에서 작동하지 않는 것 같습니다 set time_zone="america/new_york".
Manjunath Reddy

다음은 설정된 time_zone 문제에 대한 답변입니다. stackoverflow.com/questions/3451847/mysql-timezone-change
Manjunath Reddy 2012 년

2
@flindeberg에 동의하십시오. 타임 스탬프는 시간대 변경 후하지 날짜 정확한 시간을 나타냅니다
니틴 반살

193

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

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

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

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


83
나는 이것이 좋은 사고 방식이라고 생각하지 않습니다. 모든 날짜를 UTC로 저장하고 처리하고 프런트 엔드가 주어진 시간대에 따라 날짜를 표시하는지 확인했습니다. 이 방법은 간단하고 예측 가능합니다.
Kos

8
@ Kos : TIMESTAMP가 내부적으로 정확히하는 일을 UTC로 모든 날짜를 저장하고 처리하지 않습니까? (그런 다음 현지 시간대를 표시하도록 변환 하시겠습니까?)
carbocation

10
현지 시간대? DB가 내 시간대를 어떻게 알 수 있습니까? ;-) 일반적으로 데이터베이스와 사용자 인터페이스 사이에는 약간의 처리가 있습니다. 전체 처리 후에 만 ​​현지화를 수행합니다.
Kos

3
@ Koz : 내 데이터베이스가 데이터베이스 시간대를 알지 못합니다 :! 그러나 타임 스탬프는 알고 있습니다. 데이터베이스는 자체 시간대 설정을 알고 있으며 타임 스탬프를 해석 / 표현할 때 적용합니다. 중국 베이징에서 2013 년 12 월 11 일 오전 1시 1 분은 호주 시드니에서 2013 년 12 월 11 일 오전 1시 1 분과 같은 시점이 아닙니다. 구글 : '시간대'와 '프라임 자오선'.
ekerner

2
MySQL은 TIMESTAMP 값을 현재 시간대에서 UTC로 변환하여 저장하고 UTC에서 현재 시간대로 다시 검색합니다. (이는 DATETIME과 같은 다른 유형의 발생하지 않습니다.) dev.mysql.com/doc/refman/5.5/en/datetime.html
Mahdyfo

124

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

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

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


타임 스탬프-고정 된 시각, 협정 세계시 날짜 / 시간-시점, 시간 기준 (ej 시간대 현지 시간)을 기준으로 할 수 있습니다.
yucer December

110

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)에서 볼 수있는이 모든 멋진 데이터 유형은 거의 추가되지 않으며 벤더 잠금을 시작합니다.


12
나는이 해결책을 좋아한다. 2038 년에 만료되는 TIMESTAMP는 중요한 문제입니다. 그것은 실제로 그렇게 멀지 않습니다!
Charlie Dalsass

4
@CharlieDalsass 현재 소프트웨어가 그 시점에있을 것이라고 생각하십니까 :-P
Habeeb Perwad

13
데이터가 수 밀리 초로 저장된 경우 날짜별로 데이터를 쿼리하기 어렵습니다.
Ali Saeed

4
이것은 여러 시간대의 사용자 또는 다른 시간대의 데이터베이스 또는 사용자와 다른 사용자를 처리하는 데 관심이있는 경우 실제로 가장 좋은 솔루션입니다. TIMESTAMP는 결함을 설계하지 않은 경우 갈 수있는 방법이 될 수 있습니다. 깨진 솔루션이 조기에 게시 되었기 때문에 더 많은 투표를 한 것이 너무 나빴습니다 (년).
독일어

4
훌륭한 솔루션! 그리고 당신은 정확하게 "잠금"되고있는 abt입니다. 다른 사람들이 "당신을 위해 일을하도록"하는 습관을 가지게되면 프로그래머를 만드는 비트와 조각을 잃기 시작합니다.
fmc

98

TIMESTAMP는 DATETIME 동안 4 바이트 대 8 바이트입니다.

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

그러나 scronide는 1970 년의 하한선이 있다고 말했지만 미래에도 일어날 수있는 모든 일에 좋습니다.)


185
미래는 2038-01-19 03:14:07 UTC에 끝납니다.
MattBianco

5
바보입니다. TIMESTAMP 유형은 비교적 새롭기 때문에 "미래 준비"가 될 것이라고 생각했습니다. 다른 시간대로 작업 할 때마다 날짜 시간을 UTC로 변환하거나 다시 되돌릴 수 없습니다. TIMESTAMP를 1 바이트 이상 크게해야합니다. 32 * 정렬되지는 않지만 68 * 255 = 17340 년 더 추가 할 것입니다.
NickSoft

10
TIMESTAMP가 2038 년에 끝나는 이유를 알고 있습니까? 정수이기 때문에 정수에는 2147483647의 한계가 있습니다. 이것이 이유라고 생각합니다. 유형을 varchar로 변경하고 조작 방법을 변경하면 "미래 준비"가 될 수 있습니다.
vinsa

6
@vinsa, 그때까지는 미래에 준비 될 것이라고 생각하지 않습니다. 여전히 Y2K 버그를 기억하십니까? 2038 년이 다가오고 있습니다.
Pacerier

2
2038으로 (여전히 존재하는 경우) MySQL은 단순히 타임 스탬프 필드가 넓은 범위의 4 바이트보다 더 사용 할 수 있도록 업데이트됩니다
the_nuts

95
  1. TIMESTAMP는 DATETIME의 경우 4 바이트 대 8 바이트입니다.

  2. 타임 스탬프도 데이터베이스에서 더 가벼워지고 더 빠르게 색인됩니다.

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

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

  1. DATETIME은 일정하며 TIMESTAMP는 time_zone 설정에 영향을받습니다.

6
# 4 : 저장시 타임 스탬프는 일정하고 일정하지 않은 (완전히 무시할 수있는) 시간대에 대한 반면 검색시 표시된 출력은 요청 세션의 시간대에 영향을받습니다. DATETIME은 항상 기록 된 시간대를 기준으로하며 항상 해당 상황에서 고려되어야하며 이제는 응용 프로그램에 적용됩니다.
Christopher McGowan

1
좋은 대답입니다. 이 답변에 추가하기 위해 '2038-01-09 03:14:07'이상의 값을 저장하려고하면 오류가 발생하거나 '0000-00-00 00:00:00'으로 저장됩니다. 값이 시간 이동 된 (암호화 목적으로) 데이터베이스에 대해이 오류가 발생했습니다.
KarthikS

또한 mysql 버전 5.5 미만의 DEFAULT 값으로 DATETIME에 문제가 있습니다. dba.stackexchange.com/questions/132951/…
Velaro

47

실제로 응용 프로그램에 따라 다릅니다.

상하이에서의 약속을 위해 사용자가 뉴욕의 서버에 타임 스탬프를 설정하는 것을 고려하십시오. 이제 사용자가 상해에 연결하면 도쿄의 미러 서버에서 동일한 약속 시간 소인에 액세스합니다. 그는 원래 뉴욕 시간과 오프셋 된 도쿄 시간의 약속을 볼 것입니다.

따라서 약속 또는 일정과 같은 사용자 시간을 나타내는 값의 경우 날짜 시간이 더 좋습니다. 사용자는 서버 설정에 관계없이 원하는 정확한 날짜와 시간을 제어 할 수 있습니다. 설정 시간은 서버 시간대, 사용자 시간대 또는 일광 절약 시간 계산 방식의 변경 (예 : 변경)의 영향을받지 않는 설정 시간입니다.

반면 지불 트랜잭션, 테이블 수정 또는 로깅과 같은 시스템 시간을 나타내는 값에는 항상 타임 스탬프를 사용하십시오. 서버를 다른 시간대로 이동하거나 다른 시간대의 서버를 비교해도 시스템에는 영향을 미치지 않습니다.

타임 스탬프도 데이터베이스에서 더 가벼워지고 더 빠르게 색인됩니다.


응용 프로그램은 서버의 시간대에 의존해서는 안됩니다. 응용 프로그램은 항상 쿼리를 실행하기 전에 사용하는 데이터베이스 연결 세션에서 시간대를 선택해야합니다. 여러 사용자가 연결을 공유하는 경우 (예 : webapp) UTC를 사용하고 렌더링 측에서 시간대를 변환하십시오.
고인돌

42

2016 + : MySQL 시간대를 UTC로 설정하고 DATETIME을 사용하는 것이 좋습니다.

최근 프런트 엔드 프레임 워크 (Angular 1/2, react, Vue 등)를 사용하면 UTC 날짜 시간을 현지 시간으로 쉽고 자동으로 변환 할 수 있습니다.

또한 :

(서버 시간대를 변경할 가능성이 없다면)


AngularJs 예제

// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...

// font-end Output the localised time
{{item.my_datetime | date :'medium' }}

현지화 된 모든 시간 형식은 여기 ( https://docs.angularjs.org/api/ng/filter/date)에서 확인할 수 있습니다.


8
서버의 시간대 설정에 데이터를 첨부해서는 안됩니다. 책상 아래에 하나의 MySql 상자가 있다면 아마 당신을 위해 일하고있을 것입니다
Jin

@Jin UTC는 TIMESTAMP와 같은 시간대가 없음을 의미합니다. 모든 서버가 UTC 인 경우 아무런 문제가 없습니다. 2000의 구성이 있으면 작동하지 않을 수 있습니다.
Sebastien Horin

TIMESTAMP는 나중에 64 비트 값으로 업그레이드 될 수 있습니다. 그러면 더 이상 문제가 없습니다.
twicejr

이와 같은 것을 포착하기 위해 전체 타사 라이브러리를로드하면 성능에도 좋지 않을 수 있습니까? 클라이언트 측이며 데이터베이스에 영향을 미치지 않는다는 점을 고려할 때 프런트 엔드를 수행하는 모든 작업에는 서버 측 검사가 필요합니다. 완전한 그림을 생각 하면 속도 문제에 실제로 도움이됩니까? 그 벤치 마크는 조금 이상합니다. 쿼리에서 문자열을 사용하여 타임 스탬프 필드를 비교하는 것도 상당히 이상합니다. 그것은 또한 성능에 해를 끼치 지 않습니까?
NoobishPro

1
서버의 시간대에 응용 프로그램에 의존하지 마십시오. 대신 각 데이터베이스 연결에서 사용할 SET time_zone = '+0:00';시간대를 UTC로 정의하십시오 .
고인돌

37

timestamp필드의 특별한 경우이다 datetime필드. timestamp특별한 속성을 갖도록 열을 만들 수 있습니다 . 작성 및 / 또는 업데이트시 자체적으로 업데이트되도록 설정할 수 있습니다.

"더 큰"데이터베이스 용어 timestamp에는 몇 가지 특수한 경우에 대한 트리거가 있습니다.

올바른 것은 전적으로 원하는 것에 달려 있습니다.


6
아니요, 차이점은 "특별한 사례"가 아닙니다. 값을 설정 / 쿼리하는 세션의 시간대가 다르게 관련되기 때문입니다.
고인돌

"올바른 것이 무엇인지는 전적으로 원하는 것에 달려 있습니다." 충분한 근거없이 " X 를 절대로 하지 않아야한다 "또는 " 항상 Y를 해야한다"라는 SE에 대한 답변이 너무 많다 .
Agi Hammerthief

37

TIMESTAMP는 항상 UTC이며 (즉, 1970-01-01 이후 UTC로 경과 한 초), MySQL 서버는 연결 시간대의 날짜 / 시간으로 자동 변환합니다. 장기적으로 TIMESTAMP는 시간 데이터가 항상 UTC로 표시되기 때문에 갈 길입니다. 예를 들어, 다른 서버로 마이그레이션하거나 서버에서 시간대 설정을 변경하더라도 날짜가 정해지지 않습니다.

참고 : 기본 연결 시간대는 서버 시간대이지만 세션마다 변경할 수 있습니다 (참조 SET time_zone = ...).



24

MySQL에서는 테이블 열을 만들 때 아래 줄을 따라 무언가를 사용할 수 있습니다.

on update CURRENT_TIMESTAMP

이렇게하면 행을 수정하는 각 인스턴스의 시간이 업데이트되며 마지막 편집 정보를 저장하는 데 매우 유용합니다. 그러나 datetime이 아닌 timestamp에서만 작동합니다.


23

MySQL과 PHP로 작업 할 때는 항상 Unix 타임 스탬프를 사용합니다. PHP에서 기본 날짜 메소드 가되는 주요 이유 는 타임 스탬프를 매개 변수로 사용하므로 구문 분석이 필요하지 않습니다.

PHP에서 현재 Unix 타임 스탬프를 얻으려면 time();
MySQL에서 수행하십시오 SELECT UNIX_TIMESTAMP();.


6
-1 실제로 아래 답변이 더 낫다고 생각합니다-datetime을 사용하면 날짜 처리에 대한 더 많은 논리를 MySQL 자체로 푸시 할 수 있으므로 매우 유용 할 수 있습니다.
Toby Hede

MySQL에서 정렬이 PHP에서보다 느리다는 것을 보여주는 벤치 마크가 없었습니까?
sdkfasldf

strtotime을 사용하지 않을 때 사용하는 것이 좋습니다. (php5.3 dep)
Adam Ramadhan

당신은 필요한 경우 단지 FROM_UNIXTIME를 사용하여 MySQL을로 논리를 밀어 수
inarilo

필자는 PHP 애플리케이션과 MySQL에서 모든 유닉스 타임 스탬프를 사용했지만 MySQL에 날짜와 시간을 기본 날짜 / 시간 유형으로 저장하는 것이 훨씬 편리하다는 것을 알았습니다. 이 기능은 특히보고 목적 및 데이터 세트 탐색에만 유용합니다. 시간이 지남에 따라 유닉스 타임 스탬프를 복사 / 이전해야하는 것에 좌절감을 느끼면서 전환을 시작했습니다. 성능과 기타 장단점이 있다고 확신하지만 사용 사례에 따라 편의성이 상당히 미세한 최적화보다 중요 할 수 있습니다.
DavidScherer

17

내 경험에 따르면 삽입이 한 번만 발생하는 날짜 필드를 원하고 특정 필드에 대한 업데이트 또는 다른 작업을 원하지 않으면 date time으로 이동하십시오 .

예를 들어, REGISTRATION DATE 필드가 있는 user테이블을 고려하십시오 . 이 표에서 특정 사용자의 마지막 로그인 시간을 알고 싶다면 필드가 업데이트되도록 타임 스탬프 유형 필드로 이동 하십시오.user

phpMyAdmin 에서 테이블을 생성하는 경우 기본 설정은 행 업데이트가 발생할 때 타임 스탬프 필드를 업데이트합니다. 제출 된 타임 스탬프가 행 업데이트로 업데이트되지 않는 경우 다음 쿼리를 사용하여 타임 스탬프 필드가 자동 업데이트 되도록 할 수 있습니다 .

ALTER TABLE your_table
      MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

15

타임 스탬프 데이터 형식은 날짜 및 시간을 저장하지만 datetime처럼 현재 시간대 형식이 아닌 UTC 형식으로 저장합니다. 그리고 데이터를 가져올 때 타임 스탬프는 다시 현재 시간대 시간으로 변환합니다.

따라서 미국에 있고 시간대가 미국인 서버에서 데이터를 얻는다고 가정하십시오. 그러면 미국 시간대에 따라 날짜와 시간이 표시됩니다. 타임 스탬프 데이터 형식 열은 행이 업데이트 될 때 항상 자동으로 업데이트됩니다. 따라서 마지막에 특정 행이 업데이트 된시기를 추적하는 것이 유용 할 수 있습니다.

자세한 내용은 블로그 게시물 Timestamp Vs Datetime을 참조하십시오 .


SET time_zone = '+0:00';에서 가져 TIMESTAMP오거나 설정 한 값을 확인하고 변경 될 수있는 서버 time_zone 기본값에 따라 피하기 위해 (UTC here)를 사용하여 항상 세션 레벨에서 시간대를 정의해야합니다 .
고인돌

14

나는 항상 시간대를 조정하거나 날짜를 더하거나 뺄 때 등 많은 날짜 시간 정보를 다룰 때 정신을 유지하기 위해 항상 유닉스 타임 스탬프를 사용합니다. 타임 스탬프를 비교할 때, 이는 시간대의 복잡한 요소를 배제하고 서버 측 처리 (응용 프로그램 코드 또는 데이터베이스 쿼리인지 여부)에서 더 가벼운 날짜-시간 더하기 / 빼기보다 가벼운 산술을 사용하도록 리소스를 절약 할 수있게합니다. 기능.

고려해야 할 또 다른 사항 :

응용 프로그램을 구축하는 경우 데이터를 어떻게 사용해야하는지 전혀 모릅니다. 예를 들어 데이터 세트의 여러 레코드를 타사 API의 여러 항목과 비교하고 시간순으로 정렬 해야하는 경우 기꺼이해야합니다. 행에 대한 유닉스 타임 스탬프. MySQL 타임 스탬프를 사용하기로 결정하더라도 Unix 타임 스탬프를 보험으로 저장하십시오.


14

필자의 경우 UTC는 가능한 한 모든 시스템, 데이터베이스 서버 등의 시간대로 UTC를 설정했습니다. 고객에게 다른 시간대가 필요한 경우 앱에서 시간대를 구성합니다.

타임 스탬프에는 시간대가 암시 적으로 포함되므로 날짜 / 시간 필드보다는 타임 스탬프를 항상 선호합니다. 따라서 다른 시간대의 사용자가 앱을 액세스하고 현지 시간대로 날짜와 시간을 보려는 순간이 필드 유형을 사용하면 데이터가 날짜 시간 필드에 저장된 경우보다 쉽게 ​​수행 할 수 있습니다 .

또한 다른 시간대의 시스템으로 데이터베이스를 마이그레이션하는 경우 타임 스탬프를 사용하는 것이 더 자신감이 있습니다. Sumer 시간이 변경되고 1 시간 이하의 정밀도가 필요한 두 순간 간의 차이를 계산할 때 가능한 문제는 말할 것도 없습니다.

요약하면 타임 스탬프의 장점을 다음과 같이 평가합니다.

  • 국제 (다중 시간대) 앱에서 사용 가능
  • 시간대 간 쉬운 마이그레이션
  • 차이를 계산하기가 매우 쉽습니다 (두 타임 스탬프를 빼기 만하면됩니다)
  • 여름철에 날짜 / 시간에 대해 걱정할 필요가 없습니다.

이 모든 이유로, 가능한 UTC 및 타임 스탬프 필드를 선택합니다. 그리고 나는 두통을 피한다.)


타임 스탬프 데이터는 2038 년 1 월 20 일이되면 응용 프로그램을 지원하는 사람에게 재미있을 것입니다. 진드기 진드기
Wilson Hauck

타임 스탬프 유형은 비트 단위로 증가하고 가능한 값을 두 배로 늘릴 수 있습니다.
로저 캄파 네라

이론을 '조금씩 늘리는'이론을 테스트하고 2038 년 2 월 1 일을 성공적으로 저장하고 MySQL로 검색 할 수 있는지 확인하십시오. 완료되면 테이블 정의를 확인하십시오. 2038
Wilson Hauck

1
@WilsonHauck 2038 년 전에 MySQL 버전을 업그레이드해야 할 것이다. 그리고 확장 된 TIMESTAMP는 마이그레이션에 의해 처리됩니다. 또한, 모기지를 처리하는 것 외에 현재 거의 2038 년을 돌봐야하는 애플리케이션은 거의 없습니다.
고인돌

@dolmen 많은 전문가 급 도구와 재료는 20 년 이상의 보증 기간을 갖습니다. 따라서 warranties.expires_at오늘은 MySQL 타임 스탬프가 될 수 없었습니다.
alexw

13

테이블에서 UPDATE 문을 수행 할 때 시간 소인 변경에주의하십시오. 'Name'(varchar), 'Age'(int) 및 'Date_Added'(timestamp) 열이있는 테이블이 있고 다음 DML 문을 실행하는 경우

UPDATE table
SET age = 30

'Date_Added'열의 모든 단일 값이 현재 타임 스탬프로 변경됩니다.


3
테이블 설정 방법에 따라이 동작을 제어 할 수 있습니다. 볼 dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
찰스 Faiga에게

5
@CharlesFaiga 기본 동작은 다른 열이 업데이트 될 때 타임 스탬프가 업데이트되는 것입니다. 타임 스탬프가 원래 값을 유지하도록하려면이를 명시 적으로 해제해야합니다.
Lloyd Banks

저게 뭐야?! timstamp 열을ON UPDATE CURRENT_TIMESTAMP
Accountant

이것은 테이블을 생성 할 때 명시 적으로 활성화해야하는 기능 입니다.
고인돌

13

이 기사에서 가져온 참조 :

주요 차이점 :

TIMESTAMP는 레코드 변경 사항을 추적하고 레코드가 변경 될 때마다 업데이트하는 데 사용됩니다. DATETIME은 레코드 변경에 영향을받지 않는 특정 정적 값을 저장하는 데 사용됩니다.

TIMESTAMP는 또한 다른 TIME ZONE 관련 설정의 영향을받습니다. DATETIME은 일정합니다.

TIMESTAMP는 저장을 위해 내부적으로 현재 시간대를 UTC로 변환하고 검색하는 동안 현재 시간대로 다시 변환합니다. DATETIME은이 작업을 수행 할 수 없습니다.

TIMESTAMP 지원 범위 : '1970-01-01 00:00:01'UTC ~ '2038-01-19 03:14:07'UTC DATETIME 지원 범위 : '1000-01-01 00:00:00'~ '9999 -12-31 23:59:59 ′


11
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
|                                       TIMESTAMP                                       |                                 DATETIME                                 |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP requires 4 bytes.                                                           | DATETIME requires 8 bytes.                                               |
| Timestamp is the number of seconds that have elapsed since January 1, 1970 00:00 UTC. | DATETIME is a text displays 'YYYY-MM-DD HH:MM:SS' format.                |
| TIMESTAMP supported range: 1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC.    | DATETIME supported range: 1000-01-01 00:00:00 to 9999-12-31 23:59:59 |
| TIMESTAMP during retrieval converted back to the current time zone.                   | DATETIME can not do this.                                                |
| TIMESTAMP is used mostly for metadata i.e. row created/modified and audit purpose.    | DATETIME is used mostly for user-data.                                   |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+

10

Timestamp와 Datetime의 또 다른 차이점은 Timestamp에서 기본값을 NULL로 설정할 수 없다는 것입니다.


8
분명히 잘못되었습니다. 예를 들면 다음과 같습니다 CREATE TABLE t2 ( ts1 TIMESTAMP NULL, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); . 첫 번째 열은 NULL 값을 허용 할 수 있습니다.
Ormoz

10

불필요한 트리거를 사용하지 않고 현재 시간을 기반으로 자동 업데이트하는 TIMESTAMP 기능에서 탁월한 유용성을 발견했습니다. 그래도 TIMESTAMP는 UTC라고 말했지만 그래도 나뿐입니다.

다른 시간대를 추적 할 수 있으므로 예를 들어 상대 시간을 표시 해야하는 경우 UTC 시간이 바람직합니다.


9

가장 큰 차이점은

Datetime 인덱싱 관련 문제를 보려면게시물을 확인하십시오.


6
열 값을 기반으로 함수를 사용하여 선택하면 둘 다 동일한 문제가 있으며 색인을 생성 할 수 있습니다.
Marcus Adams

4
인덱스는 타임 스탬프에서 작동하며 날짜 / 시간에는 작동하지 않습니까? 그 게시물에서 잘못된 결론을 도출했습니다.
Salman A

9

datetime표준 시간대와 관련된 많은 문제와 버그에 직면 한 후 응용 프로그램에서 사용 을 중단했습니다 . IMHO를 사용하는 timestamp것이 datetime대부분의 경우 보다 낫습니다 . .

당신은 시간이 언제 물어볼 때? 그리고 대답은 '2019-02-05 21:18:30'과 같이 나타납니다. 완료되지 않고 정의되지 않은 대답은 다른 부분이 없기 때문에 어떤 시간대에 있습니까? 워싱턴? 모스크바? 베이징 ?

시간대없이 날짜 / 시간을 사용한다는 것은 응용 프로그램이 하나의 시간대 만 처리한다는 것을 의미하지만 타임 스탬프는 다음과 같은 이점을 제공합니다. datetime 는 다른 시간대에서 동일한 정확한 시점을 표시 할 수있는 유연성과 합니다.

다음은 사용을 후회 datetime하고 데이터를 타임 스탬프에 저장하기를 원하는 경우입니다.

  1. 고객의 편의를 위해 수학을 수행하지 않고 원하는 시간대를 기준으로 시간을 표시하고 시간을 의미있는 시간대로 변환하려고합니다. 시간대를 변경하기 만하면 모든 응용 프로그램 코드가 동일합니다. (실제로 응용 프로그램을 시작할 때 시간대를 정의하거나 PHP 응용 프로그램의 경우 처리를 요청해야합니다)

    SET time_zone = '+2:00';
  2. 귀하는 귀하가 거주하는 국가를 변경했으며 실제 시간대를 변경하지 않고 다른 시간대에서 보는 동안 데이터 유지 보수 작업을 계속합니다.

  3. 전 세계 여러 고객의 데이터를 수락하며 각 고객은 자신의 시간대에 시간을 삽입합니다.

한마디로

datetime = 응용 프로그램은 1 시간대를 지원합니다 (삽입 및 선택 모두)

timestamp = 응용 프로그램은 모든 시간대를 지원합니다 (삽입 및 선택 모두)


이 대답은 표준 시간대와 관련하여 타임 스탬프의 유연성과 용이성에 중점을두기위한 것이며 열 크기, 범위 또는 분수 와 같은 다른 차이점은 다루지 않습니다 .


를 사용하는 date필드가 timestamp있고 하나의 테이블에 다른 필드가 사용 되는 경우 필터링 된 데이터가 where표준 시간대 변경 사항에 따르지 않기 때문에 새로운 문제가 발생할 것이라고 생각합니다 .
Erlang P

@ErlangP이 경우 응용 프로그램은 date쿼리를 보내기 전에 열의 시간대 문제를 해결해야 합니다.
회계사 م

7

타임 스탬프를 사용하여 모든 것을 하나의 공통 원시 형식으로 유지하고 데이터를 PHP 코드 또는 SQL 쿼리로 형식화합니다. 모든 것을 평범한 초 안에 유지하기 위해 코드에서 편리한 경우가 있습니다.


7

A TIMESTAMP에는 4 바이트가 DATETIME필요 하지만 A 에는 8 바이트 가 필요합니다.


6

나는 숫자로 변환하고 숫자에 대해 걱정할 수 있기 때문에 유닉스 타임 스탬프를 좋아합니다. 또한 추가 / 빼기 및 지속 시간 등을 얻습니다. 그런 다음 결과를 원하는 형식으로 날짜로 변환하십시오. 이 코드는 문서의 타임 스탬프와 현재 시간 사이의 시간 (분)을 확인합니다.

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);

4
또는 사람이 읽을 수 있고 기본 MySQL 날짜 시간을 사용하고 기본 MySQL 함수를 사용하여 날짜 시간을 추가 / 빼기하십시오.
Julien Palard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.