programing

MariaDB UNIX_TIMESTamp()가 미래의 날짜를 사용할 때 NULL을 반환합니다.

goodsources 2022. 10. 1. 15:42
반응형

MariaDB UNIX_TIMESTamp()가 미래의 날짜를 사용할 때 NULL을 반환합니다.

UNIX_TIMESTamp()를 사용하고 있습니다만, 장래의 날짜가 지나면, 어느 시점에서 NULL이 반환되기 시작합니다.

예를 들어 다음 SQL은 Null이 아닌 적절한 결과를 제공합니다.SELECT UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL 18 YEAR)).

단, 그 값을 1년 늘리면 반환되는 값은NULL:SELECT UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL 19 YEAR))

여기 뭐가 문제죠?정수 오버플로일 수 있습니까?어떻게 해결하죠?

다음 MariaDB 버전을 사용하고 있습니다.Ver 15.1 Readline 5.1을 사용한 Linux(x86_64)용 10.4.7-MariaDB 배포

Unix 시간(서명된 32비트) 종료일03:14:07 Tuesday, 19 January 2038 UTC

연관된:Year_2038_문제


UNIX_TIMESTamp:

MariaDB의 타임스탬프 최대값은 2147483647로 2038-01-19 05:14:07에 해당합니다.이는 기본 32비트 제한 때문입니다.이 이후의 날짜에 함수를 사용하면 NULL이 반환됩니다.이 이후의 날짜가 필요한 경우 DATETIME을 저장소 유형으로 사용하십시오.

SELECT ADDDATE(NOW(), INTERVAL 19 YEAR)  -- DATETIME
-- 2038-09-07 18:42:39

위의 코멘트에서 설명한 바와 같이 2038 Epochalipse 날짜 제한을 넘어서는 작업을 할 수 없었습니다.필드를 DATETIME으로 변환하지도 않았습니다.이 최종 솔루션에 영향을 주는 다른 고려사항이 있을 수 있습니다.

유일한 회피책은 PHP에서 DB에서 날짜를 가져와 strtotime() PHP 함수를 사용하여 UNIX TIMESTAMP를 가져오는 것이었습니다.

SELECT DATE_FORMAT(CONVERT(thedatefield, DATETIME),"%Y-%m-%dT%TZ") AS thedatefield

다른 날짜 형식(미국어, 영어, 라틴어 등)이 있어 문제가 발생할 수 있으므로 MySQL/MariaDB 함수 2개를 사용하여 출력을 ISO 날짜(YY-MM-DDTh:mm:ss)로 평탄하게 하고 있습니다.어느 시스템에서든 출력이 균일하면 UNIX TIMESTAMP에 올바르게 해석될 수 있다는 확신을 가지고 strtotime() PHP 함수에 출력을 전달할 수 있습니다.

CONVERT: 날짜를 날짜/시간 DB 유형으로 지정합니다.

DATE_FORMAT: 날짜를 ISO 형식(YYY-MM-DDThh:mm:ss)으로 변환합니다.

물론 이러한 기능을 제거하고 시스템 특성에 맞게 솔루션을 조정하여 처리 부하를 줄일 수 있습니다.이 솔루션은 시스템 날짜 스타일에 관계없이 사용할 수 있습니다.

PHP에 의해 1개의 레지스터만 반환되는 경우(가장 간단한 경우) 반환되는 2D 또는 테이블 배열의 첫 번째 치수를 0으로 설정합니다.

date("U",strtotime($php_array[0][thedatefield]))

"U" 플래그에 의한 PHP date() 함수는 DB 출력을 32비트 2038 Epochalips 제한 없이 UNIX TIMESTAMP로 변환합니다.

언급URL : https://stackoverflow.com/questions/57836038/mariadb-unix-timestamp-returns-null-when-using-dates-in-the-future

반응형