MySQL에서 datetime에 삽입 할 때 PHP date () 형식


324

date()결과를 MySQL datetime유형 열에 삽입하려는 경우 PHP 에서 함수에 전달할 올바른 형식은 무엇입니까 ?

나는 노력하고 date("Y-M-D G:i:s")있지만 매번 "0000-00-00 00:00:00"을 삽입합니다.


3
현재까지 매개 변수를 제공하지 않기 때문에 실제로 현재 시간을 기록하고 싶습니까?
Mark Elliot

답변:


680

문제는 텍스트 표현 인 'M'and를 사용 하고 'D'있으며 MySQL은 형식의 숫자 표현을 기대하고 있다는 것입니다2010-02-06 19:30:13

시도 : date("Y-m-d H:i:s")이것은 동등한 숫자를 사용합니다.

편집 : 전환 GH는 영향이 없을 수 있지만, 당신은 아마 선도적 인 0과 24 시간 형식을 사용하려면,.


28
이것은 누구나 필요로하는 가장 일반적인 날짜 / 시간 형식 중 하나 여야합니다. PHP 내장 또는 날짜 함수 자체의 일부 여야합니다 (예 : 'c', 'r')
billynoah

33
이것이 내가 모르는 이유가 아닌 이유. 모든 스택 오버플로를 참조해야합니다. 단일. 작동. 시각.
Mazatec

11
내 코드에서 이와 같은 사용법을 검색하는 것보다 여기에 오는 것이 더 빠릅니다.
MRodrigues

64
그냥 형식을 기억하기위한 귀여운 연상의 생각 : " Y는 우리의 m의 y를 d를 하지 먹었다 그의 ". 너무 많은 수준에서 작동 :)
IzzEps

2
ISO 8601 및 RFC 2822
billynoah이

105

PHP date()매뉴얼 페이지 의 의견에서 :

<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>

당신은 'Y'를 맞았습니다. 그것은 1 년입니다. 그러나 'M'은 3 문자 달이고 'm'은 2 자리 달입니다. 'd'대신 'D'와 동일한 문제입니다. 'G'는 1 또는 2 자리 시간으로, 'H'는 필요할 때 항상 선행 0을 갖습니다.


1
감사합니다 @Pekka-나는 당신과 내가 거의 같은 담당자를 기억-당신은 꽤 활동적입니다.
Tim Lytle

1
그래, 나는 지금 많은 일을하고 있으며, SO는 내가 가장 좋아하는 취미입니다 :) 다시 변경됩니다.
Pekka

41

대안 해결책은 다음과 같습니다. PHP에서 날짜를 타임 스탬프로 사용하는 경우 PHP를 사용하여 날짜를 처리하지 않고 FROM_UNIXTIME함수 를 사용하여 DB에서 날짜를 변환하도록 합니다.

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)

mysql> select * from a_table;

+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+

이것은 우아한 해결책입니다.
감사

2
@trejder, 누가 MySQL에서하는 것이 PHP에서하는 것보다 빠르다고 말했습니까? DB가 일반적으로 병목 현상이므로 최대한 빨리 들어가고 싶어하기 때문에 PHP로하는 것이 좋습니다 .
Pacerier

1
@Pacerier DB는 잘못 구축 된 DB가 있거나보다 강력한 효과적인 단일 쿼리 대신 작은 쿼리를 너무 많이 실행하거나 ORM을 사용하여 데이터베이스를 관리하는 경우 병목 현상이 발생합니다. 인덱스가 잘 설정된 관계형 데이터베이스가있는 견고한 SQL은 느리지 않습니다.
mopsyd

2
@mopsyd, DB를 수평 확장 하려면 복잡성이 필요 하므로 병목 현상이 발생 합니다. 코드 변경없이 전 세계에 복제 할 수있는 웹 서버와 비교해보십시오.
Pacerier

1
쿼리가 실패하고 어딘가에 기록되어 디버깅해야하는 경우 타임 스탬프는 @ tim-lytle에 설명 된 형식화 된 날짜 문자열보다 읽기가 훨씬 어렵습니다.
humbads 2016 년

27

다음 PHP 코드를 사용하여 MySQL DATETIME 열에 삽입하는 변수를 만듭니다.

$datetime = date_create()->format('Y-m-d H:i:s');

서버의 현재 날짜 및 시간이 유지됩니다.


12
$date_old = '23-5-2016 23:15:23'; 
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));

//Format should be like 'Y-m-d H:i:s'`enter code here`

2
이 코드가 질문에 대답 할 수 있지만, 질문에 대한 이유 및 / 또는 방법 에 대한 추가 컨텍스트를 제공 하면 장기적인 가치가 크게 향상됩니다. 제발 편집 답 몇 가지 설명을 추가하고 서식 문제를 해결합니다.
Toby Speight

9

시간 소인을 MySQL DATETIME 컬럼으로 형식화하십시오.

strftime('%Y-%m-%d %H:%M:%S',$timestamp);

8

PHP로 MySQL 날짜 / 시간 형식

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

8

이 기능을 사용합니다 (PHP 7)

function getDateForDatabase(string $date): string {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

이전 버전의 PHP (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

첫 번째 줄을 편집 한 후에 효과가 있었기 때문에 귀하의 답변에 투표했습니다. 형식 선언에서 오류가 발생 function getDateForDatabase(string $date) : string {하는 function getDateForDatabase($date) {이유 PHP에 충분한 지식이 없습니다.
Chris Pink

"getDateForDatabase ()에 전달 된 인수 1은 문자열, 주어진 문자열의 인스턴스 여야합니다."-입력은 문자열입니다.
Chris Pink

7

타임 스탬프를 사용하지 않으면 PHP의 date () 메소드를 사용할 필요가 없습니다. 경우 dateposted날짜 시간 열이, 당신은 다음과 같이 현재 날짜를 삽입 할 수 있습니다 :

$db->query("INSERT INTO table (dateposted) VALUES (now())");

2
이 접근법을 공유해 주셔서 감사합니다. 내가 지금까지 본 가장 쉬운 방법입니다.
Shondeslitch

2

이것은 간단한 답변을 찾고 나를 화나게했습니다. 마지막으로 모든 입력을 포착하고 정확하거나 적어도 유효하고 확인할 수있는 좋은 SQL 문자열을 제공하는 것처럼 보이는이 기능을 만들었습니다. 1999-12-31이면 아마도 잘못된 것이지만 MySQL에서는 나쁜 오류가 발생하지 않습니다.

function MakeSQLDate($date) {
    if (is_null($date)) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    }

    if (($t = strtotime($date)) === false) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    } else {
        return date('Y-m-d H:i:s', strtotime($date));
    }
}

1

DateTimePHP7 +에서 클래스 사용하기 :

function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
    $dt = new DateTime();
    $dt->setTimezone(new DateTimeZone('UTC'));
    $dt->setDate($year, $month, $day);
    $dt->setTime(0, 0, 0, 0); // set tine to midnight

    return $dt->format("Y-m-d H:i:s");
}

1

수락 된 답변에 대한 작은 부록 : 데이터베이스 datetime가 UTC로 저장되면 (항상 내가하는 일) gmdate("Y-m-d H:i:s")대신 대신 사용해야 합니다 date("Y-m-d H:i:s").

또는 MySQL이 모든 것을 처리하게하려면 일부 답변에서 알 수 있듯이 MySQL UTC_TIMESTAMP과 동일한 결과를 삽입 합니다.

참고 : 나는 현재 시간에 관한 질문을 이해했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.