답변:
MySQL의 타임 스탬프는 일반적으로 레코드 변경 사항을 추적하는 데 사용되며 종종 레코드가 변경 될 때마다 업데이트됩니다. 특정 값을 저장하려면 날짜 시간 필드를 사용해야합니다.
UNIX 타임 스탬프 또는 기본 MySQL 날짜 / 시간 필드 사용 여부를 결정하려면 기본 형식을 사용하십시오. 이런 식으로 MySQL 내에서 계산을 수행 할 수
있으며 PHP로 레코드를 조작하려는 경우 레코드를 쿼리 할 때 ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")
값 형식을 UNIX 타임 스탬프로 변경하는 것이 간단합니다 ("SELECT UNIX_TIMESTAMP(my_datetime)")
.
DATETIME
날짜 (달력에서 볼 수 있음)와 시간 (벽시계에서 볼 수 있음)을 TIMESTAMP
나타내는 반면 잘 정의 된 특정 시점 을 나타냅니다. 애플리케이션이 시간대를 처리하는 경우 매우 중요 할 수 있습니다. '2010-09-01 16:31:00'은 얼마나 되었습니까? 그것은 당신이 어느 시간대에 있는지에 달려 있습니다. 나에게 그것은 몇 초 전이었습니다. 왜냐하면 당신은 미래의 시간을 나타낼 수도 있습니다. '1970-01-01 00:00:00 UTC'이후 1283351460 초라고 말하면 정확히 어떤 시점에 대해 알고 있는지 알 수 있습니다. (아래 Nir의 탁월한 답변 참조). [단점 : 유효 범위].
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의 하한에 도달 할 가능성이 높습니다.
new Date().getTime()
이미 64 비트 값을 제공합니다.
아래 예제 TIMESTAMP
는 time-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
변경되었지만 변경되지 않았지만 사람의 표현은 변경되었습니다.
set time_zone="america/new_york"
.
주요 차이점은 DATETIME은 일정하고 TIMESTAMP는 time_zone
설정의 영향을받는 것 입니다.
따라서 시간대에 따라 클러스터를 동기화했거나 앞으로있을 수있는 경우에만 중요합니다.
간단히 말해서 : 호주에 데이터베이스가 있고 미국에서 데이터베이스를 동기화 / 채우기 위해 해당 데이터베이스를 덤프하면 TIMESTAMP는 새 시간대의 이벤트 실시간을 반영하도록 업데이트되지만 DATETIME은 여전히 au 시간대의 이벤트 시간을 반영합니다 .
TIMESTAMP가 사용 된 곳에서 사용되는 DATETIME의 좋은 예는 Facebook에서 서버가 시간대 전체에서 발생한 시간을 확실하게 알 수없는 Facebook입니다. 한때 나는 대화가 있었는데 메시지가 실제로 전송되기 전에 메시지에 답장을했다. 물론 시간이 동기화되지 않고 게시 된 경우 메시징 소프트웨어의 시간대 변환이 잘못되어 발생할 수도 있습니다.
나는이 결정을 시맨틱 기반으로한다.
고정 된 특정 시점을 기록해야 할 때 타임 스탬프를 사용합니다. 예를 들어 레코드가 데이터베이스에 삽입되었거나 일부 사용자 작업이 발생한 경우입니다.
날짜 / 시간을 임의로 설정하고 변경할 수있는 날짜 / 시간 필드를 사용합니다. 예를 들어, 사용자가 나중에 변경 약속을 저장할 수있는 경우.
DATETIME 또는 TIMESTAMP 필드를 사용 하지 않는 것이 좋습니다 . 특정 날짜를 전체 생일 (예 : 생일)로 나타내려면 DATE 유형을 사용하십시오. 그러나 그보다 더 구체적인 경우에는 단위가 아닌 실제 순간을 기록하는 데 관심이있을 것입니다. 시간 (일, 주, 월, 년). DATETIME 또는 TIMESTAMP를 사용하는 대신 BIGINT를 사용하고 신기원 이후의 시간 (밀리 초)을 저장하십시오 (Java를 사용하는 경우 System.currentTimeMillis ()). 여기에는 몇 가지 장점이 있습니다.
이 문제는 데이터베이스에 돈 값 (예 : $ 1.99)을 저장하는 방법과 밀접한 관련이 있습니다. Decimal 또는 데이터베이스의 Money 유형을 사용해야합니까 아니면 최악의 Double을 사용해야합니까? 이러한 옵션 중 세 가지 모두 위에 나열된 여러 가지 이유로 끔찍합니다. 해결책은 BIGINT를 사용하여 금액을 센트로 저장 한 다음 사용자에게 값을 표시 할 때 센트를 달러로 변환하는 것입니다. 데이터베이스의 임무는 데이터를 저장하고 해당 데이터를 해석하지 않는 것입니다. 데이터베이스 (특히 Oracle)에서 볼 수있는이 모든 멋진 데이터 유형은 거의 추가되지 않으며 벤더 잠금을 시작합니다.
TIMESTAMP는 DATETIME 동안 4 바이트 대 8 바이트입니다.
http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html
그러나 scronide는 1970 년의 하한선이 있다고 말했지만 미래에도 일어날 수있는 모든 일에 좋습니다.)
TIMESTAMP는 DATETIME의 경우 4 바이트 대 8 바이트입니다.
타임 스탬프도 데이터베이스에서 더 가벼워지고 더 빠르게 색인됩니다.
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 모드에 따라 다양한 속성이 있습니다.
실제로 응용 프로그램에 따라 다릅니다.
상하이에서의 약속을 위해 사용자가 뉴욕의 서버에 타임 스탬프를 설정하는 것을 고려하십시오. 이제 사용자가 상해에 연결하면 도쿄의 미러 서버에서 동일한 약속 시간 소인에 액세스합니다. 그는 원래 뉴욕 시간과 오프셋 된 도쿄 시간의 약속을 볼 것입니다.
따라서 약속 또는 일정과 같은 사용자 시간을 나타내는 값의 경우 날짜 시간이 더 좋습니다. 사용자는 서버 설정에 관계없이 원하는 정확한 날짜와 시간을 제어 할 수 있습니다. 설정 시간은 서버 시간대, 사용자 시간대 또는 일광 절약 시간 계산 방식의 변경 (예 : 변경)의 영향을받지 않는 설정 시간입니다.
반면 지불 트랜잭션, 테이블 수정 또는 로깅과 같은 시스템 시간을 나타내는 값에는 항상 타임 스탬프를 사용하십시오. 서버를 다른 시간대로 이동하거나 다른 시간대의 서버를 비교해도 시스템에는 영향을 미치지 않습니다.
타임 스탬프도 데이터베이스에서 더 가벼워지고 더 빠르게 색인됩니다.
최근 프런트 엔드 프레임 워크 (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)에서 확인할 수 있습니다.
SET time_zone = '+0:00';
시간대를 UTC로 정의하십시오 .
timestamp
필드의 특별한 경우이다 datetime
필드. timestamp
특별한 속성을 갖도록 열을 만들 수 있습니다 . 작성 및 / 또는 업데이트시 자체적으로 업데이트되도록 설정할 수 있습니다.
"더 큰"데이터베이스 용어 timestamp
에는 몇 가지 특수한 경우에 대한 트리거가 있습니다.
올바른 것은 전적으로 원하는 것에 달려 있습니다.
DATETIME, TIMESTAMP 및 DATE 비교
[.fraction]은 무엇입니까?
출처 :
MySQL에서는 테이블 열을 만들 때 아래 줄을 따라 무언가를 사용할 수 있습니다.
on update CURRENT_TIMESTAMP
이렇게하면 행을 수정하는 각 인스턴스의 시간이 업데이트되며 마지막 편집 정보를 저장하는 데 매우 유용합니다. 그러나 datetime이 아닌 timestamp에서만 작동합니다.
MySQL과 PHP로 작업 할 때는 항상 Unix 타임 스탬프를 사용합니다. PHP에서 기본 날짜 메소드 가되는 주요 이유 는 타임 스탬프를 매개 변수로 사용하므로 구문 분석이 필요하지 않습니다.
PHP에서 현재 Unix 타임 스탬프를 얻으려면 time();
MySQL에서 수행하십시오 SELECT UNIX_TIMESTAMP();
.
내 경험에 따르면 삽입이 한 번만 발생하는 날짜 필드를 원하고 특정 필드에 대한 업데이트 또는 다른 작업을 원하지 않으면 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;
타임 스탬프 데이터 형식은 날짜 및 시간을 저장하지만 datetime처럼 현재 시간대 형식이 아닌 UTC 형식으로 저장합니다. 그리고 데이터를 가져올 때 타임 스탬프는 다시 현재 시간대 시간으로 변환합니다.
따라서 미국에 있고 시간대가 미국인 서버에서 데이터를 얻는다고 가정하십시오. 그러면 미국 시간대에 따라 날짜와 시간이 표시됩니다. 타임 스탬프 데이터 형식 열은 행이 업데이트 될 때 항상 자동으로 업데이트됩니다. 따라서 마지막에 특정 행이 업데이트 된시기를 추적하는 것이 유용 할 수 있습니다.
자세한 내용은 블로그 게시물 Timestamp Vs Datetime을 참조하십시오 .
SET time_zone = '+0:00';
에서 가져 TIMESTAMP
오거나 설정 한 값을 확인하고 변경 될 수있는 서버 time_zone 기본값에 따라 피하기 위해 (UTC here)를 사용하여 항상 세션 레벨에서 시간대를 정의해야합니다 .
나는 항상 시간대를 조정하거나 날짜를 더하거나 뺄 때 등 많은 날짜 시간 정보를 다룰 때 정신을 유지하기 위해 항상 유닉스 타임 스탬프를 사용합니다. 타임 스탬프를 비교할 때, 이는 시간대의 복잡한 요소를 배제하고 서버 측 처리 (응용 프로그램 코드 또는 데이터베이스 쿼리인지 여부)에서 더 가벼운 날짜-시간 더하기 / 빼기보다 가벼운 산술을 사용하도록 리소스를 절약 할 수있게합니다. 기능.
고려해야 할 또 다른 사항 :
응용 프로그램을 구축하는 경우 데이터를 어떻게 사용해야하는지 전혀 모릅니다. 예를 들어 데이터 세트의 여러 레코드를 타사 API의 여러 항목과 비교하고 시간순으로 정렬 해야하는 경우 기꺼이해야합니다. 행에 대한 유닉스 타임 스탬프. MySQL 타임 스탬프를 사용하기로 결정하더라도 Unix 타임 스탬프를 보험으로 저장하십시오.
필자의 경우 UTC는 가능한 한 모든 시스템, 데이터베이스 서버 등의 시간대로 UTC를 설정했습니다. 고객에게 다른 시간대가 필요한 경우 앱에서 시간대를 구성합니다.
타임 스탬프에는 시간대가 암시 적으로 포함되므로 날짜 / 시간 필드보다는 타임 스탬프를 항상 선호합니다. 따라서 다른 시간대의 사용자가 앱을 액세스하고 현지 시간대로 날짜와 시간을 보려는 순간이 필드 유형을 사용하면 데이터가 날짜 시간 필드에 저장된 경우보다 쉽게 수행 할 수 있습니다 .
또한 다른 시간대의 시스템으로 데이터베이스를 마이그레이션하는 경우 타임 스탬프를 사용하는 것이 더 자신감이 있습니다. Sumer 시간이 변경되고 1 시간 이하의 정밀도가 필요한 두 순간 간의 차이를 계산할 때 가능한 문제는 말할 것도 없습니다.
요약하면 타임 스탬프의 장점을 다음과 같이 평가합니다.
이 모든 이유로, 가능한 UTC 및 타임 스탬프 필드를 선택합니다. 그리고 나는 두통을 피한다.)
warranties.expires_at
오늘은 MySQL 타임 스탬프가 될 수 없었습니다.
테이블에서 UPDATE 문을 수행 할 때 시간 소인 변경에주의하십시오. 'Name'(varchar), 'Age'(int) 및 'Date_Added'(timestamp) 열이있는 테이블이 있고 다음 DML 문을 실행하는 경우
UPDATE table
SET age = 30
'Date_Added'열의 모든 단일 값이 현재 타임 스탬프로 변경됩니다.
ON UPDATE CURRENT_TIMESTAMP
주요 차이점 :
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 ′
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| 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. |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
Timestamp와 Datetime의 또 다른 차이점은 Timestamp에서 기본값을 NULL로 설정할 수 없다는 것입니다.
CREATE TABLE t2 ( ts1 TIMESTAMP NULL, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
. 첫 번째 열은 NULL 값을 허용 할 수 있습니다.
datetime
표준 시간대와 관련된 많은 문제와 버그에 직면 한 후 응용 프로그램에서 사용 을 중단했습니다 . IMHO를 사용하는 timestamp
것이 datetime
대부분의 경우 보다 낫습니다 . .
당신은 시간이 언제 물어볼 때? 그리고 대답은 '2019-02-05 21:18:30'과 같이 나타납니다. 완료되지 않고 정의되지 않은 대답은 다른 부분이 없기 때문에 어떤 시간대에 있습니까? 워싱턴? 모스크바? 베이징 ?
시간대없이 날짜 / 시간을 사용한다는 것은 응용 프로그램이 하나의 시간대 만 처리한다는 것을 의미하지만 타임 스탬프는 다음과 같은 이점을 제공합니다. datetime
는 다른 시간대에서 동일한 정확한 시점을 표시 할 수있는 유연성과 합니다.
다음은 사용을 후회 datetime
하고 데이터를 타임 스탬프에 저장하기를 원하는 경우입니다.
고객의 편의를 위해 수학을 수행하지 않고 원하는 시간대를 기준으로 시간을 표시하고 시간을 의미있는 시간대로 변환하려고합니다. 시간대를 변경하기 만하면 모든 응용 프로그램 코드가 동일합니다. (실제로 응용 프로그램을 시작할 때 시간대를 정의하거나 PHP 응용 프로그램의 경우 처리를 요청해야합니다)
SET time_zone = '+2:00';
귀하는 귀하가 거주하는 국가를 변경했으며 실제 시간대를 변경하지 않고 다른 시간대에서 보는 동안 데이터 유지 보수 작업을 계속합니다.
datetime
= 응용 프로그램은 1 시간대를 지원합니다 (삽입 및 선택 모두)
timestamp
= 응용 프로그램은 모든 시간대를 지원합니다 (삽입 및 선택 모두)
이 대답은 표준 시간대와 관련하여 타임 스탬프의 유연성과 용이성에 중점을두기위한 것이며 열 크기, 범위 또는 분수 와 같은 다른 차이점은 다루지 않습니다 .
date
필드가 timestamp
있고 하나의 테이블에 다른 필드가 사용 되는 경우 필터링 된 데이터가 where
표준 시간대 변경 사항에 따르지 않기 때문에 새로운 문제가 발생할 것이라고 생각합니다 .
date
쿼리를 보내기 전에 열의 시간대 문제를 해결해야 합니다.
나는 숫자로 변환하고 숫자에 대해 걱정할 수 있기 때문에 유닉스 타임 스탬프를 좋아합니다. 또한 추가 / 빼기 및 지속 시간 등을 얻습니다. 그런 다음 결과를 원하는 형식으로 날짜로 변환하십시오. 이 코드는 문서의 타임 스탬프와 현재 시간 사이의 시간 (분)을 확인합니다.
$date = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now - $result) / 60);
$min = round($unix_diff_min);