2010-05-15 3 views
2

PHP time() 함수에 의해 생성 된 타임 스탬프가 SQL datetime과 다른 이유는 무엇입니까?PHP 시간과 SQL 시간의 차이점은 무엇입니까?

PHP에서 date('Y-m-d', time());을 수행하는 경우, 필자에게 시간이 주어진다. 난 그냥 time() 부분을 가지고 할 경우

$now = time(); 
//then execute this statement 'SELECT * FROM `reservation` WHERE created_at < $now' 

을 나는 아무것도 얻을 수 없다. 하지만, 이봐, 그래서 만약 $now의 값은 1,273,959,833하고 있었고, 난 내가 만든 레코드를 볼 다음

'SELECT * FROM `reservation` WHERE created_at < 127395983300000000' 

을 조회. 하나는 마이크로 초에서 다른 하나는 초 단위로 추적되는 것 같지만이 문서는 찾을 수 없습니다! 이 둘 사이의 올바른 전환은 무엇입니까?

+0

어떤 sql 데이터베이스를 사용하고 있습니까? –

+0

안녕하세요, My using My MySQL 5.1.36 – Ying

답변

7

time() 함수는 마이크로 초를 반환하지 않으므로 올바른 데이터 유형을 사용하는 경우 작동해야합니다. 하지만 지금은 두 가지 데이터 유형이 있습니다. INT 및 날짜 필드 (DATE/DATETIME/TIMESTAMP 일 수 있음). SQL은 타임 스탬프를 가지고 싶어 -

SELECT * FROM Tbl WHERE UNIX_TIMESTAMP(date) < $timestamp; 
+0

감사합니다! 이게 내가 찾고 있던거야. – Ying

+1

예. 또한 PHP 서버의 시계가 MySql 서버의 시계와 다른 점을 고려하십시오 - 이로 인해 문제가 발생할 수 있습니다. 특히 다른 시간대 또는 다른 DST 설정에있는 경우 * 모든 것이 * UTC 형식이어야한다고 생각하십시오. UNIX_TIMESTAMP는 UTC가 아니라 MySql-local입니다. 덕분에 – johntellsall

2

time() 유닉스 타임 스탬프 (초 2038-01-19 경과) 제공 : 당신이 정수로 타임 스탬프로 데이터베이스에 날짜를 비교하려는 경우, 당신은 같은 것을 사용할 수 있습니다 형식은 YYYY-mm-dd hh-ii-ss이며 date()에 의해 수행됩니다. 따라서 2 개의 PHP 함수를 호출하지 않으려면 $now = date("Y-m-d H:i:s")을 사용하거나 더 나은 방법으로 SQL 쿼리를 created_at < NOW()으로 변경하십시오.

+0

. 그래도 지금은 아니지만 특정 날짜에 지정해야 할 것입니다. – Ying

1

그들은 각각 장단점이있는 날짜를 저장하는 2 가지 다른 방법입니다. MySQL의 날짜 필드를 사용하거나 유닉스 타임 스탬프를 INT 필드에 저장하기 만하면됩니다. 당신은 또한 사용할 수 있습니다

SELECT UNIX_TIMESTAMP (FIELD_NAME를)

...에서 유닉스 타임 스탬프로 날짜 필드를 반환 할 수 있습니다.

MySQL 날짜 필드는 사람이 읽을 수 있으며 가까운 장래에 모든 날짜를 저장할 수 있습니다. 그러나 올바르게 처리되지 않으면 심각한 문제를 일으킬 수있는 표준 시간대 정보를 저장하지 않습니다. Facebook은이 문제를 잠시 뒤로 돌 렸습니다.

유닉스 타임 스탬프는 (1970 년 1 월 1 일 오전 12시 이후의 초 수로 정의되기 때문에) 시간대 정보를 저장합니다. 비교 연산은 정수에서 더 빠르며, PHP의 시간/날짜 함수는 유닉스 타임 스탬프와 함께 사용되도록 설계되었습니다. 그러나 Linux는 1902 년부터 2038 년까지의 날짜와 1970 년부터 2038 년까지의 Windows 만 지원할 수 있습니다. 일반적으로 MySQL과 아키텍처는 2038 년 이전에 64 비트 정수로 전환되지만 먼 미래의 날짜를 저장해야하거나 과거, 유닉스 시간은 당신을위한 것이 아닙니다.

관련 문제