2017-09-07 7 views
0

생년월일이 읽을 수있는 날짜 형식 yyyy-mm-dd hh:mm:ss으로 변환해야하는 MySQL 데이터베이스에 저장되어 있습니다. MySQL의 From_Unix 함수는 1970 년 이전의 생년월일이기 때문에 사용할 수 없으며 함수는 NULL을 반환합니다. (1942년 7월 21일 즉 -866138400000 함)부정적인 (signed) bigint로 저장된 MySQL 날짜를 날짜 형식으로 변환하려면 어떻게해야합니까?

I 틱 사용하려고 갖지만 또한 NULL 복귀된다

(FROM_DAYS(365 + (req.PATIENTDOB/864000000000)) + INTERVAL (req.PATIENTDOB % 864000000000)/10000000 SECOND) AS ptDob 

상관 미리 크게 감상 할 수있다. 고맙습니다.

+0

그래서 값이 여전히 1970 년 이후 마이크로로 저장되고, 음의 값은 1970 년 전에 의미에서 봐 단지 그것을 이해하는 데 나에게 두 번째가 걸렸기 때문에 그것을 적어 라. – RealCheeseLord

답변

1

왜 복잡한 일을하는지 잘 모르겠습니다. 마이크로 초 대신 초를 얻으려면 1000으로 나누고 1970-01-01에서 빼십시오.

mysql > select '1970-01-01' + interval -866138400000/1000 second; 
+---------------------------------------------------+ 
| '1970-01-01' + interval -866138400000/1000 second | 
+---------------------------------------------------+ 
| 1942-07-22 06:00:00        | 
+---------------------------------------------------+ 
1 row in set (0.00 sec) 

그래서 쿼리는 실제로 물론이 될 것이다 :

select '1970-01-01' + interval your_column/1000 second from your_table; 

이 쿼리는 당신의 가정은, 그것이 될 것이라고 1942년 7월 21일이 잘못된 것을 증명한다. 1942-07-22가 정확합니다.

mysql > select timestampdiff(second, '1942-07-21', '1970-01-01'); 
+---------------------------------------------------+ 
| timestampdiff(second, '1942-07-21', '1970-01-01') | 
+---------------------------------------------------+ 
|           866246400 | 
+---------------------------------------------------+ 
0

네거티브 에포크를 조사하면서 답변을 찾았습니다. 나는 결국 From_Unixtime 함수를 사용할 수있었습니다!

select date_format((DATE_ADD(FROM_UNIXTIME(0), interval -866138400000/ 1000 second)),'%Y-%m-%d') as ptdate; -> "1942년 7월 21일"

링크 Reference에> 음의 신기원 섹션