실제로 MySQL과 PHP의 날짜 시간 대 타임 스탬프?


24

데이터 유형을 날짜 시간 또는 타임 스탬프로 지정하는 방법을 잘 모르겠습니다. 두 가지가 있지만 다른 이벤트에 필요하다고 생각합니다. 내 웹 사이트는 전세계에 제품과 서비스를 판매하고 있으며 사용자가 로그인 할 수있는 계정 시스템도 있습니다. 다음을 명확하게하십시오 :

  • 고객이 내 웹 사이트에서 제품을 구매하는 현재 날짜 및 시간 : Datetime?
  • Google 시스템에서 계산 한 위치 및 구매 날짜 / 시간을 기준으로 한 배송 날짜 및 시간 : Datetime?
  • 마지막으로 계정에 로그인 한 시간 : Timestamp?

    1. 구매 날짜 (현재 날짜)를 저장 한 다음 데이터베이스에 저장하는 PHP 코드는 무엇입니까?
    2. 인터넷에서 많은 설명을 읽은 후에도 각각을 사용하는 방법을 자세히 설명하십시오.

얼마 전 나는 성능이 절대적인 필수 프로젝트 인 대규모 프로젝트를 가졌다. 몇 달 간의 연구 끝에 varchar 필드에 저장된 UTC 타임 스탬프를 사용하게되면서 우리의 요구에 더 빠르고 더 나은 것으로 판명되었다 (대형 소셜 네트워크)
— JasonDavis

답변:


29

MySQL 타임 스탬프 :

  • UTC로 저장

    저장시 UTC로 변환되고 검색시 표준 시간대로 다시 변환됩니다. 시간대 설정 을 변경 하면 검색된 값도 변경됩니다.

  • 자동 초기화 및 업데이트 가능

    기본값 및 / 또는 자동 업데이트 값을 CURRENT_TIMESTAMP

  • 1970-01-01 00:00:01 UTC~ 의 범위를 가짐2038-01-19 03:14:07 UTC

반면 MySQL 날짜 시간 :

  • 당신이 저장하는 것은 당신이 얻는 것입니다.

  • 1000-01-01 00:00:00~ 의 범위를 가짐9999-12-31 23:59:59

    범위를 벗어나는 값은 작동 할 수 -하지만 범위 내에서만 값이된다 보장 사업에.

  • 일 또는 월이 0 인 날짜를 저장할 수 있습니다.

    이것은 생일을 저장하는 MySQL의 방법입니다! TIMESTAMP는 0으로 만 예외를 제외하고는으로 할 수 없습니다 0000-00-00.

  • 필요한 경우 ALLOW_INVALID_DATES 모드 에서 유효하지 않은 날짜를 저장할 수 있습니다 .

  • 경우에 따라 기본값을로 설정할 수 NOW()있지만 자동으로 초기화되고 업데이트 된 날짜를 선호하는보다 자연스러운 방법은입니다 TIMESTAMP.

물론이 또한 DATE및 TIME처럼 작동하는, DATETIME하지만 물론 DATE상관하지 않는다 시간과 TIME날짜를 상관하지 않는다. 네 가지 데이터 형식은 모두 다양한 날짜 및 시간 함수와 완벽하게 작동 하지만 데이터 형식을 혼합 할 때는 변환 효과를 알고 있어야 합니다 .

이제, 당신의 질문에 : 당신은 DATETIME모든 곳에서 사용해야합니다 . 기술적 인 이유가 아니라 MySQL의 작동 방식이 아직 확실하지 않기 때문에 DATETIME더 간단한 선택입니다. 이것은 저장하기 전에 PHP에서 현재 타임 스탬프를 계산해야한다는 것을 의미합니다.

$mysqldate = date("Y-m-d H:i:s"); 

PHP의 날짜 함수 는 다음과 같이 작동합니다.

string date ( string $format [, int $timestamp = time() ] )

이 "Y-m-d H:i:s"형식은 MySQL과 호환되는 형식이며 두 번째 매개 변수를 비워두면 현재 UNIX 타임 스탬프 를 얻기 위해 date()호출 time()됩니다 .

TIMESTAMP대신에를 사용 DATETIME하면 현재 타임 스탬프를 결정하는 책임을 대신하는 MySQL의 부가 가치가 있으며 삽입 / 업데이트 할 때 필드를 건너 뛸 수 있습니다. 그러나 이미 쿼리를 보내고 PHP에서 현재 타임 스탬프를 가져 오는 코드가 최소이므로 DATETIME모든 것을 안전하게 처리 할 수 ​​있습니다 .

PHP 타임 스탬프를 데이터베이스에 저장하는 실제 코드는 PHP Data Objects를 살펴보고 여전히 확실하지 않은 경우 대신 StackOverflow 를 요청하십시오 . 그러나 거의 1.5k 관련 질문이 이미 있습니다. 질문 하기 전에 반드시 확인하십시오. 힌트, 준비된 진술 은 멋진 아이들이 그것을하는 방법입니다.


흠, 그것은 당신이 MySQL이나 테이블 구조로 쿼리를 보내는 방법에 문제가 될 수 있습니다 ... StackOverflow는 이러한 종류의 문제에 대한 더 좋은 곳입니다. 문제가 무엇인지 그리고 이미 시도한 것에 대한 세부 사항. 우리는 여기서 실제로 구현 세부 사항에 대해 논의하지 않습니다 ...
— yannis

답장을 보내 주셔서 감사합니다. $ mysqldate = date ( "Ymd H : i : s"); 내 PHP 코드에서 $ query = INSERT INTO 테이블 VALUE ( ' ". $ mysqldate."') 그러나 날짜 (필드)-날짜 시간 (데이터 유형)에서 0000-00-00 00:00:00으로 MySQL에 유지됩니다. 현재 날짜와 시간을 저장하려고합니다. 데이터베이스에서 데이터 유형을 타임 스탬프로 설정하면 PHP로 코딩하는 방법은 무엇입니까?
— 모듈 식

현재 Stackoverflow에 대한 의견을 게시 할 수 없습니다. 조금 부끄러운 것 같지만 그들이 나에게 한 방식입니다.
— 모듈 식

유감이지만, 일시 중지 모드 인 경우에는 그만한 이유가 있습니다. 이제 주석에서 코드의 가능한 오류 중 하나는 필드의 이름을으로 지정하는 것 Date입니다. DATE데이터 유형에 대한 예약어 이며 이상한 일이 발생할 수 있습니다 (MySQL 버전에 따라 다름). 이름을 바꾸고 creationdate어떤 일이 발생하는지 확인하십시오. . 또한 PHP에서 TIMESTAMP필드를 필드와 동일하게 취급해야 DATETIME하지만 실제로는 중요하지 않습니다. 그들의 형식은 동일합니다.
— yannis December

정말 고마워. 그 이유를 알아 내려고 거의 밤새도록 보낸 후에 정렬되었습니다. :)
— Modular

2

이 기사에서 가져온 참조 :

주요 차이점 :

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 ′


1
2040 년에 타임 스탬프 레코드 변경에 무엇을 사용 하시겠습니까? 나는 그렇지 않다고 생각한다.
— Bsienn

-1

글쎄, 나는 이것을 매우 간단한 방식으로 봅니다. 귀하의 경우에는 둘 다 사용하는 것 datetime등을 timestamp. 두 가지를 모두 사용하면 데이터 저장과 같은 추가 문제가 발생하지 않습니다. 테이블에 하나의 추가 필드 (열)도 큰 문제가 아닙니다.

그래서 지금까지의 관점과 경험에서 나는 보통 두 가지를 모두 사용합니다. 방문자에게 날짜를 표시하거나 방문자가 이해할 수 있도록하려면 날짜 / 시간 형식으로 날짜를 표시하십시오.

날짜 시간 형식은 무언가를 계산할 때 고통 스러울 수 있습니다 (2 날짜의 차이, 현재 날짜에서 어제 날짜 가져 오기, 현재 날짜에서 1 주일 전에 가져 오기, 내일 날짜 또는 이와 유사한 것을 얻으십시오). 실제로 어렵지는 않지만 일반적으로 그것들을 변환 timestamp한 다음 일을해야합니다. 그리고 예를 들어 현재 날짜 시간 : $current = date("Y-m-d");또는 $current = date("Y-m-d H:i:s");시간, 분 및 초를 원하는 경우.

타임 스탬프는 11 자리 숫자이며 실제로 "의미"하지는 않습니다. 당신이 그것을 볼 때 당신은 그것이 나타내는 날짜를 알 수 없습니다. 따라서 사용자에게 친숙하지 않으므로 에코를 사용하여 방문자에게 보여주기 위해 사용할 수 없습니다. 읽을 수있는 것으로 "변환"해야합니다. 그러나 쉽게 변환하고 다른 날짜를 계산할 수있는 기능도 제공합니다. 예를 들어 내일의 타임 스탬프를 동시에 얻으려면 현재 날짜에 초 수를 추가하면 내일 타임 스탬프가 있습니다. 예 : $tomorrow = time()+24*3600;초 단위의 두 날짜 또는 그와 비슷한 것을 쉽게 얻을 수 있습니다.

따라서 날짜 시간과 타임 스탬프를 모두 사용하는 것이 좋습니다. 예를 들어 PhpMyadmin을 사용하고 일부 데이터를 빠르게보고 2011-12-20 10:15:20싶더라도 11 자리 숫자 만 보면 날짜 시간 형식 (예 :) 으로 날짜를 볼 때 더 쉬울 것입니다. 따라서 둘 다 사용하고 나에게 더 적합한 전화를 사용하십시오.

하나만 선택하거나 선택하려면 타임 스탬프를 제안하고 그렇지 않으면 둘 다 사용하십시오.


1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingMySQL 타임 스탬프는 datetime과 동일한 형식으로 저장됩니다. 설명하는 계산을 수행하거나 MySQL의 많은 날짜 / 시간 함수를 사용하고 데이터베이스에서 계산을 수행하려면 PHP 타임 스탬프로 변환해야합니다. 당신의 대답은 실제로 의미가 없습니다.
— yannis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.