실제로 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.

물론이 또한 DATETIME처럼 작동하는, 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.