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
'programing' 카테고리의 다른 글
대문자 부울란과PHP 소문자 (0) | 2022.10.01 |
---|---|
동적 html 로드 후 클릭 이벤트를 추가하기 위한 jQuery .live() vs .on() 메서드 (0) | 2022.10.01 |
PHP에서 foreach 루프를 사용하는 동안 배열의 마지막 요소 찾기 (1) | 2022.10.01 |
MySQL: 다른 컬럼의 변경에 따라 컬럼에 순차적으로 지정 (0) | 2022.10.01 |
목록의 항목을 단일 문자열에 연결하려면 어떻게 해야 합니까? (0) | 2022.10.01 |