programing

UTC ISO8601 날짜를 MySQL 데이터베이스에 저장하려면 어떻게 해야 합니까?

muds 2023. 9. 18. 22:43
반응형

UTC ISO8601 날짜를 MySQL 데이터베이스에 저장하려면 어떻게 해야 합니까?

저는 다음과 같은 형식으로 수천 개의 날짜를 가지고 있습니다.

2011-10-02T23:25:42Z(UTC에서 ISO 8601로 통칭)

이러한 ISO8601 날짜를 MySQL 데이터베이스에 저장하려면 어떤 MySQL 데이터 유형을 사용해야 합니까?예.Datetime,timestamp아니면 다른 것?

비교(예: 두 날짜/시간 사이의 기록 획득) 및 쿼리 결과 주문에 가장 적합한 것은 무엇입니까?데이터베이스가 매우 큰 경우에는 어떻게 해야 합니까?

그리고 MySQL 스토리지를 위해 위의 PHP 문자열을 변환하는 가장 좋은 방법은 무엇입니까?(내 생각엔date_default_timezone_set('UTC');사용할 수 있습니까?)

날짜-시간 값을 유형 필드에 유지하는 것이DATETIME자연스러운 방법일 겁니다

제가 현재 PHP 어플리케이션을 사용해 본 경험으로는, 오직read/write이 정보에 관한 작업은 문제가 있을 수 있습니다.

가능한 솔루션 중 하나(사용자가 사용한다고 가정할 경우)DATETIME데이터 유형) 전체 프로세스를 적절하게 수행하기 위해서는 다음과 같은 접근 방식이 있을 수 있습니다.

PHP 사용을 위한 DATETIME 값 읽기

  1. 얻다DATETIME데이터베이스의 필드를 쿼리에서 문자열 표현 형식으로 변환합니다.'2011-10-02T23:25:42Z'을 이용하여DATE_FORMATMySQL 함수:'%Y-%m-%dT%H:%i:%sZ'서식 지정 문자열(DATE_FORMAT문서)
  2. 가져온 열 값을 이 특정 형식으로 읽고 PHP에 유효한 문자열에서 실제 날짜-시간 표현(예:DateTime클래스 개체 및DateTime::createFromFormat정태적 방법이 주어짐'Y-m-d\TH:i:s\Z'서식 지정 문자열(T그리고.Z형식 지정 지시사항으로 취급하지 않기 위해 탈출합니다(메소드경우 해당).
  3. 변환된 값을 실제 날짜 비교(텍스트 비교가 아닌)와 같이 적용 가능한 모든 논리와 함께 실제 날짜-시간 값으로 사용합니다.

MySQL 데이터베이스에 PHP 날짜-시간 쓰기

  1. PHP 변환DateTime클래스 객체를 UTC 형식 문자열 표현으로 ISO 8601에 적용합니다.DateTime클래스 객체의format기존과 동일한 방법'Y-m-d\TH:i:s\Z'문자열(변환)을 포맷합니다.
  2. 수행하다INSERT/UPDATEMySQL 함수에 대한 매개변수로 준비된 문자열을 사용하여 데이터베이스 정보에 대한 작업STR_TO_DATE(함께)'%Y-%m-%dT%H:%i:%sZ'문자열 포맷)을 실제 데이터베이스로 변환합니다. 이것을 실제 데이터베이스로 변환합니다.DATETIMEvalue (STR문서_)TO_DATE).

PHP의 코드 예시

아래에서 PDO 객체를 사용하는 그러한 접근법의 초안 예를 찾으십시오.

$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    // run the query aquring 1 example row with DATETIME data 
    // converted with MySQL DATE_FORMAT function to its string representation 
    // in the chosen format (in our case: ISO 8601 / UTC)
    $stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
                        ." FROM your_table LIMIT 1"); 

    if($stmt !== FALSE) {
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        // convert the acquired string representation from DB 
        // (i.e. '2011-10-02T23:25:42Z' )
        // to PHP DateTime object which has all the logic of date-time manipulation:    
        $dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);

        // the following should print i.e. 2011-10-02T23:25:42Z
        echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');  

        // now let's write PHP DateTime class object '$dateTimeObject' 
        // back to the database
        $stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) " 
                             . " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");

        $dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');

        // convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
        // in order to be able to put in in the query using PDO text parameter
        $stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);

        $stmtInsertDT->execute();

        // So the real insert query being perform would be i.e.:
        /*
           INSERT INTO your_table(dt_column) 
           VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
        */
    }
}
catch(\PDOException $pexc) {
 // serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}

이 접근 방식은 PHP와 MySQL 데이터베이스 간의 날짜-시간 값을 운영하는 데 많은 도움이 되었습니다.

당신에게도 도움이 되기를 바랍니다.

을 사용할 수 .DateTime날짜 및 시간을 저장하기 위한 데이터 형식입니다.

사용하다CAST을 mysql에 에 mysql는수한에수l는DateTimetype .type .

다음은 예입니다.

CAST("2011-10-02T23:25:42Z" AS DATETIME)

이것은 당신에게 줄 것입니다.2011-10-02 23:25:42.

이것이 당신에게 도움이 되기를 바랍니다.

를 를 할 하여 를 할 하여 를 strtotime php:

date_default_timezone_set('UTC');
$date = '2011-10-02T23:25:42Z';//(aka ISO 8601 in UTC)
$time = strtotime($date); //time is now equals to the timestamp
$converted = date('l, F jS Y \a\t g:ia', $time); //convert to date if you prefer, credit to Marc B for the parameters

이제 당신은 당신의 날짜를 입력할 것입니다.MySQL용을 timestamp아니면datetime어떤 것이 당신의 요구에 가장 적합한지에 따라.여기 두 가지 유형에 대해 알아야 할 가장 중요한 것들이 있습니다.


타임스탬프

  • UTC '1970-01-01 00:00:01' UTC ~ UTC '2038-01-09 03:14:07' 범위
  • 시간대 설정의 영향을 받습니다.
  • 4바이트 스토리지
  • 허락하다on update current_timestamp모든 버전에 대해 열에 표시됩니다.
  • 인덱스가 훨씬 빠름
  • NULL.
  • 은 현재 에서 Δ Δ Δ Δ Δ Δ Δ Δ Δ 로 변환됩니다.UTCdUTC검색을 위해 현재 시간대로 이동합니다.

날짜시간

  • '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59' 범위
  • 상수(시간대는 영향을 주지 않음)
  • 스토리지 8바이트
  • 에만 에만 5.6.5

비교(예: 두 날짜/시간 사이의 기록 획득) 및 쿼리 결과 주문에 가장 적합한 것은 무엇입니까?데이터베이스가 매우 큰 경우에는 어떻게 해야 합니까?

앞에서 말한 바에 따르면, 그러면 당신은timestamp대용량 데이터베이스의 경우 스토리지가 작을수록 성능이 향상되고 인덱스가 빨라져 비교에 적합합니다.그러나, 당신은 당신의 날짜가 그들의 한계에 맞는지 확인해야 합니다.timestamp이전에 말씀드렸듯이, 그렇지 않으면 선택의 여지가 없으므로 사용해야 합니다.datetime.

에 문서strtotime: http://php.net/manual/en/function.strtotime.php

ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ을 하지 않기 위해 매일 .mysql* 사용하지 않는 함수를 사용하십시오.PDO아니면mysqli*당신이 삽입물을 언제 할 것인지.

http://php.net/manual/en/book.pdo.php

http://php.net/manual/en/book.mysqli.php

할 수 ( UTC ISO8601 으로 할 는 ).2011-10-02T23:25:42Z및 SQL functionality.)및 SQL DATTIME을다든합니다 .

그러나 MySQL(http://dev.mysql.com/doc/refman/5.5/en/datetime.html 관련)은 항상 UTC에 시간/날짜를 저장합니다.또한 http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html 접속 시간대를 수정할 수 있습니다.

PHP로 실행하면

date_default_timezone_set('UTC');

MySQL에서

SET time_zone = +00:00

물론 PHP와 MySQL은 UTC를 사용할 것입니다.

그러면 시간대 불일치를 신경쓰지 않고 모든 데이터베이스 문자열을 DateTime으로 변환할 수 있습니다.

PHP DateTime을 MySQL dateTime 문자열로 변환하려면 DateTime 개체 시간대를 UTC로 설정해야 합니다.

$datetime->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s');

내 시스템(PDT)에서 날짜 시간을 사용하면 다음과 같습니다.

SELECT CONVERT_TZ(str_to_date('2011-10-02T23:25:42Z','%Y-%m-%dT%H:%i:%sZ'),'+00:00','SYSTEM') from dual;

2011-10-02 16:25:42

날짜 시간에 분수 마이크로초가 있는 경우, 다음과 같이 Z 앞에 .%f를 입력합니다.

SELECT CONVERT_TZ(str_to_date('2011-10-02T23:25:42.123456Z','%Y-%m-%dT%H:%i:%s.%fZ'),'+00:00','SYSTEM') from dual;

2011-10-02 16:25:42.123456

날짜 시간을 사용하는 것이 더 좋은 이유는 다음과 같습니다.

  1. 날짜 시간을 사용하면 일, 월 차감과 같은 mysql 측의 날짜 조작을 수행할 수 있습니다.
  2. 데이터를 정렬할 수 있습니다.
  3. DB가 방대한 경우 - HDD에서 varchar가 더 많이 발생합니다.

언급URL : https://stackoverflow.com/questions/8047462/how-do-i-store-an-utc-iso8601-date-in-a-mysql-database

반응형