문제

당신을 사용하는 것이 좋습 datetimetimestamp 필드유(를 사용하여 MySQL)?

나는 작업 PHP 서버 사이드에서 작동합니다.

도움이 되었습니까?

해결책

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

UNIX 타임 스탬프 또는 기본 MySQL DateTime 필드를 사용하는 것을 결정하려면 기본 형식으로 이동하십시오. MySQL 내에서 그런 식으로 계산할 수 있습니다("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") 그리고 값의 형식을 Unix 타임 스탬프로 변경하는 것은 간단합니다. ("SELECT UNIX_TIMESTAMP(my_datetime)") PHP로 작동하려면 레코드를 쿼리 할 때.

다른 팁

MySQL 5 이상에서 타임 스탬프 값은 현재 시간 구역에서 Storage를 위해 UTC로 변환되고 UTC에서 현재 시간대로 다시 변환됩니다. (이것은 타임 스탬프 데이터 유형에 대해서만 발생하며 ~ 아니다 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'입니다.

...

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

일반적으로 타임 스탬프의 하한에 도달 할 가능성이 높습니다 (예 : 생년월일 저장).

아래 예제는 어떻게 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 대 타임 스탬프 데이터 유형.

주된 차이점은 해당 날짜가 일정하는 동안 타임 스탬프가에 의해 영향을 받 time_zone 설정입니다.

그래서 그것은 때에만 있는—또는 미래에 있는 동기화된 클러스터에서 시간 지역이 있습니다.

에서 간단한 말씀: 가 있는 경우에 데이터베이스에서 호주 및을 덤프하는 데이터베이스 synchronize/채우는 데이터베이스에서 아메리카,후에 타임스탬프 것입 업데이트를 반영하는 실시간의 이벤트에는 새로운 시대,동 DATETIME 여전히 시간이 반영의 이벤트에 au 시간대.

의 좋은 예를 들어 DATETIME 사용되는 타임 스탬프는 데 사용되어 있어야에서 Facebook 자신의 서버는지 확실히 어떤 시간에 물건이 일어난 시간에 걸쳐 영역이 있습니다.면을 대화는 시간이라고 말했 회신을 메시지기 전에 메시지를 실제로 보냈습니다.(물론 이것도에 의해 발생되어 있 나쁜 시간대에서 번역 메시지를 소프트웨어는 경우 번들에 게시되기보다는 동기화됩니다.)

나는이 결정을 시맨틱 기반에서 결정합니다.

(고정 된 지점을 더 많이 또는 적은 고정점을 녹음해야 할 때 타임 스탬프를 사용합니다. 예를 들어 레코드가 데이터베이스에 삽입 된 경우 또는 일부 사용자 조치가 발생한 경우.

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

타임 스탬프는 DateTime의 4 바이트 대 8 바이트입니다.

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

그러나 Scronide와 마찬가지로 1970 년의 한계는 낮다고 말했습니다. 미래에 일어날 수있는 일에 좋습니다.)

사용하는 것이 좋습니다 어느 것도 아니다 데이터 타임 또는 타임 스탬프 필드. 특정 날을 전체 (생일과 같은)로 대표하려면 날짜 유형을 사용하지만 그보다 더 구체적이라면 단위와 달리 실제 순간을 녹화하는 데 관심이있을 것입니다. 시간 (일, 주, 월, 연도). DateTime 또는 Timestamp를 사용하는 대신 Bigint를 사용하고 Epoch (Java를 사용하는 경우 System.CurrentTimemillis () 이후 밀리 초 수를 간단히 저장하십시오. 여기에는 몇 가지 장점이 있습니다.

  1. 공급 업체 잠금을 피하십시오. 거의 모든 데이터베이스는 비교적 유사한 방식으로 정수를 지원합니다. 다른 데이터베이스로 이동하고 싶다고 가정하십시오. MySQL의 DateTime 값과 Oracle을 정의하는 방법의 차이점에 대해 걱정하고 싶습니까? MySQL의 다른 버전 중에서도 타임 스탬프는 정밀도가 다릅니다. MySQL이 타임 스탬프에서 밀리 초를 지원 한 것은 최근에 막 었습니다.
  2. 시간대 문제가 없습니다. 여기에 다른 데이터 유형이있는 Timezones에서 어떤 일이 일어나는지에 대한 통찰력있는 의견이 있습니다. 그러나이 상식적인 지식이며 동료들이 모두 시간을내어 배우게 될 것인가? 다른 한편으로, 큰 것을 java.util.date로 바꾸는 것은 매우 어렵습니다. Bigint를 사용하면 시간이 지남에 따라 많은 문제가 발생합니다.
  3. 범위 나 정밀도에 대한 걱정은 없습니다. 미래 날짜 범위에 의해 단축되는 것에 대해 걱정할 필요가 없습니다 (타임 스탬프는 2038 년으로 만갑니다).
  4. 타사 도구 통합. 정수를 사용하면 데이터베이스와 인터페이스하는 것은 제 3 자 도구 (예 : Eclipselink)에 대한 사소한 일입니다. 모든 타사 도구가 MySQL과 마찬가지로 "DateTime"에 대해 동일한 이해를 가질 수는 없습니다. 이러한 사용자 정의 데이터 유형을 사용하는 경우 java.sql.timestamp 또는 java.util.date 객체를 사용해야하는지 여부를 최대 절전 모드로 시도하고 알아보십시오. 기본 데이터 유형을 사용하면 타사 도구와 함께 사용됩니다.

이 문제는 데이터베이스에 화폐 가치 (예 : $ 1.99)를 저장하는 방법과 밀접한 관련이 있습니다. 10 진수, 또는 데이터베이스의 돈 유형을 사용해야합니까, 아니면 최악의 두 배를 사용해야합니까? 이 3 가지 옵션은 모두 위에 나열된 많은 이유 때문에 끔찍합니다. 해결책은 Bigint를 사용하여 돈의 가치를 센트로 저장 한 다음 사용자에게 가치를 표시 할 때 센트를 달러로 변환하는 것입니다. 데이터베이스의 임무는 데이터를 저장하고 해당 데이터를 intrepret하지 않는 것입니다. 데이터베이스 (특히 Oracle)에서 볼 수있는이 멋진 데이터 유형은 거의 추가하지 않고 공급 업체 잠금으로가는 길을 시작합니다.

  1. 타임 스탬프는 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 ′입니다.

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

  1. DateTime은 일정하지만 TimeStamp는 Time_Zone 설정에 의해 영향을받습니다.

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

Sanghai에서 약속을 위해 사용자가 사용자가 서버에 타임 스탬프를 설정하는 것을 고려하십시오. 이제 사용자가 상하이에서 연결하면 도쿄의 거울 서버에서 동일한 약속 타임 스탬프에 액세스합니다. 그는 오리지널 뉴욕 타임에서 상쇄 된 도쿄 시대의 약속을 보게 될 것입니다.

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

반면, 지불 거래, 테이블 수정 또는 로깅과 같은 시스템 시간을 나타내는 값의 경우 항상 타임 스탬프를 사용하십시오. 서버를 다른 시간대로 이동하거나 다른 시간대의 서버를 비교할 때 시스템은 영향을받지 않습니다.

타임 스탬프도 데이터베이스에서 가볍고 더 빨리 색인화되었습니다.

2016 +: 내가 조언하는 것은 MySQL Timezone을 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

timestamp 필드는 특별한 경우입니다 datetime 필드. 당신은 만들 수 있습니다 timestamp 특수 속성을 갖는 열; 생성 및/또는 업데이트에서 자체 업데이트하도록 설정할 수 있습니다.

"더 큰"데이터베이스 용어로 timestamp 그것에 몇 개의 특별 케이스 트리거가 있습니다.

올바른 것이 무엇인지 전적으로 당신이하고 싶은 일에 달려 있습니다.

타임 스탬프는 항상 UTC (즉, 1970-01-01 이후 몇 초가 지나면 UTC에 있으며, MySQL 서버는 연결 시간대 날짜/시간으로 자동 변환합니다. 장기적으로 타임 스탬프는 시간 데이터가 항상 UTC에 있다는 것을 알고 있기 때문에 갈 길입니다. 예를 들어, 다른 서버로 마이그레이션하거나 서버의 시간대 설정을 변경하는 경우 날짜를 망치지 않습니다.

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

DateTime, 타임 스탬프 및 날짜의 비교

enter image description here

그게 뭐야 [.fraction]?

  • DateTime 또는 타임 스탬프 값에는 최대 마이크로 초 (6 자리) 정밀도의 후행 분수 초 부분이 포함될 수 있습니다. 특히, 데이터 타임 또는 타임 스탬프 열에 삽입 된 값의 일부 부분 부분은 폐기되지 않고 저장됩니다. 이것은 물론 선택 사항입니다.

출처 :

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

on update CURRENT_TIMESTAMP

이것은 각 인스턴스에서 행을 수정하는 시간을 업데이트하며 때로는 저장된 마지막 편집 정보에 매우 도움이됩니다. 이것은 datetime이 아닌 Timestamp에서만 작동합니다.

MySQL 및 PHP와 함께 작업 할 때는 항상 Unix 타임 스탬프를 사용합니다. 이것의 주된 이유는 기본값입니다 데이트 PHP의 메소드는 타임 스탬프를 매개 변수로 사용하므로 구문 분석이 필요하지 않습니다.

PHP에서 현재 UNIX 타임 스탬프를 얻으려면 time();
그리고 MySQL에서 SELECT UNIX_TIMESTAMP();.

내 경험에서 삽입이 한 번만 발생하는 날짜 필드를 원한다면 해당 특정 필드에 업데이트 나 다른 조치를 취하고 싶지 않은 경우 날짜 시간.

예를 들어, 고려하십시오 user a 등록 날짜 필드. 그것에 user 테이블, 특정 사용자의 마지막 로그인을 알고 싶다면 필드와 함께 가십시오. 타임 스탬프 필드가 업데이트되도록 입력하십시오.

당신이 테이블을 만들고 있다면 phpmyadmin 기본 설정이 업데이트됩니다 타임 스탬프 행 업데이트가 발생할 때 필드. TimeStamp가 ROW 업데이트로 업데이트되지 않으면 다음 쿼리를 사용하여 타임 스탬프 필드가 자동 업데이트됩니다.

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

타임 스탬프 데이터 유형은 날짜와 시간을 저장하지만 DateTime과 같이 현재 시간대 형식이 아닌 UTC 형식으로 저장합니다. 그리고 데이터를 가져 오면 타임 스탬프는 다시이를 현재 시간대 시간으로 변환합니다.

따라서 미국에 있고 미국의 시간대가있는 서버에서 데이터를 받고 있다고 가정하십시오. 그런 다음 USA 시간대에 따라 날짜와 시간을 얻게됩니다. 타임 스탬프 데이터 유형 열은 행이 업데이트되면 항상 자동으로 업데이트됩니다. 따라서 지난번에 특정 행이 업데이트 된시기를 추적하는 것이 유용 할 수 있습니다.

자세한 내용은 블로그 게시물을 읽을 수 있습니다 타임 스탬프 대 DateTime .

나는 항상 Unix 타임 스탬프를 사용합니다. 특히 시간이 많은 시간 정보를 다룰 때, 특히 시간대 조정, 날짜 추가/빼기 등을 처리 할 때 많은 DateTime 정보를 처리 할 때 정신을 유지합니다. 타임 스탬프를 비교할 때 이것은 시간대의 복잡한 요소를 제외하고 서버 측면 처리 (애플리케이션 코드 또는 데이터베이스 쿼리이든)에서 리소스를 절약 할 수 있도록합니다. 기능.

고려해야 할 또 다른 것 :

애플리케이션을 구축하는 경우 데이터가 어떻게 사용되어야하는지 알 수 없습니다. 예를 들어, 데이터 세트에서 많은 레코드를 비교 해야하는 경우, 제 3 자 API의 많은 항목을 사용하여 연대순으로 말하면 기꺼이 가질 수 있습니다. 행에 대한 유닉스 타임 스탬프. MySQL 타임 스탬프를 사용하기로 결정하더라도 UNIX 타임 스탬프를 보험으로 저장하십시오.

테이블에서 업데이트 명령문을 할 때 타임 스탬프 변경을 조심하십시오. 열 '이름'(varchar), 'age'(int) 및 'date_added'(타임 스탬프)가있는 테이블이있는 경우 다음 DML 문을 실행합니다.

UPDATE table
SET age = 30

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

이 기사에서 가져온 참조 :

주요 차이점 :

타임 스탬프는 레코드의 변경 사항을 추적하고 레코드가 변경 될 때마다 업데이트하는 데 사용됩니다. DateTime은 레코드의 변경에 영향을받지 않는 특정 및 정적 값을 저장하는 데 사용됩니다.

타임 스탬프는 또한 다른 시간대 관련 설정의 영향을받습니다. DateTime은 일정합니다.

타임 스탬프는 내부적으로 현재 시간대를 저장을 위해 UTC로 변환하고 검색 중에 현재 시간대로 다시 변환되었습니다. DateTime 은이 작업을 수행 할 수 없습니다.

타임 스탬프 지원 범위 : '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 ′

내 경우에는,내가 설정 UTC 으로 시간대에 대한 모든 것:시스템,데이터베이스 서버,etc.때마다 나는 할 수 있습니다.는 경우 나의 고객이 요구하는 다른 시간대,그때 구성요.

나는 거의 항상 선호하는 타임 스탬프를 보다는 오히려 datetime 필드기 때문에 타임 스탬프 포함 시간대를 사용한다.그래서 순간부터는 앱에 액세스할 수 있는 사용자에서 다른 시간대 및 참조 원하는 날짜와 시간에 자신의 로컬 시간대,이 필드 형식은 아주 쉽게 그것을 할 경우 보다 데이터가 저장되었수 필드가 있습니다.

로러의 경우 마이그레이션의 데이터베이스 시스템과는 다른 시간대에,나는 느낌을 더 확신을 사용하여 타임 스탬프.지 않을 말할 때 발생 가능한 문제의 계산 차이점을 두 대와 수메르의 시간에서 변경 사고 필요로 하는 정밀도 1 시간 또는 적습니다.

그래서,요약,내가 값이 장점 timestamp:

  • 에서 사용할 준비가 국제적(다중 시간대)애플리케이션
  • 쉽게 마이그레이션 간의 시간 영역
  • 아주 쉽게 계산하는 시대를 초월한 클래식-(다만 빼기 두는 타임 스탬프)
  • 걱정 없음에 대한 날짜 in/out 여름 기간

이 모든 이유로 나를 선택하 UTC 및 타임 스탬프 필드를 수집합니다.과를 피하는 두통;)

주요 차이점은입니다

이거 봐요 DateTime 인덱싱 문제를 보려면 게시합니다

타임 스탬프와 DateTime의 또 다른 차이점은 타임 스탬프에 있습니다.

불필요한 트리거를 사용하지 않고 현재 시간을 기준으로 자체를 자동 업데이트 할 수있는 타임 스탬프의 능력에서 탁월한 유용성을 발견했습니다. 타임 스탬프는 말한 것처럼 UTC이지만 그것은 나뿐입니다.

다른 시간에 따라 추적 할 수 있으므로 예를 들어 상대 시간을 표시 해야하는 경우 UTC 시간이 원하는 것입니다.

Timestamp를 사용하여 모든 것을 하나의 공통 원시 형식으로 유지하고 PHP 코드 또는 SQL 쿼리에서 데이터를 형식으로 유지하는 것이 좋습니다. 모든 것을 평범한 초로 유지하기 위해 코드에 유용한 사례가 있습니다.

+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
|                                       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.                                   |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+

숫자로 변환하고 숫자에 대해 걱정할 수 있기 때문에 Unix 타임 스탬프를 좋아합니다. 또한 기간을 추가/빼고받는 다음 결과를 현재 어떤 형식으로 변환합니다. 이 코드는 문서의 타임 스탬프와 현재 시간 사이에 몇 분의 시간이 얼마나 많은지 알아냅니다.

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

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

타임 스탬프는 시간대가 다른 다른 국가의 방문자가있을 때 유용합니다. 타임 스탬프를 모든 국가 시간대로 쉽게 변환 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top