Kita bisa melakukan ini sebagai gantinya:
FROM_UNIXTIME(0) + INTERVAL -957632400 SECOND
FROM_UNIXTIME
fungsi dibatasi oleh rentang yang diizinkan untuk TIMESTAMP
datatype, yang merupakan standar 32-bit unsigned int range 1970-01-01 hingga 2038-01-sesuatu. Perangkat lunak lain telah diperbarui untuk mendukung bilangan bulat bertanda 64-bit, tetapi MySQL belum menyediakan fungsionalitas itu (setidaknya tidak di 5.1.x).
Solusi di MySQL adalah hindari menggunakan TIMESTAMP
tipe data dan menggunakan DATETIME
sebagai gantinya, ketika kita membutuhkan rentang yang lebih besar (mis. tanggal sebelum 1 Januari 1970).
Kita dapat menggunakan DATE_ADD
berfungsi untuk mengurangi detik dari 1 Jan 1970, seperti ini:
SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)
N.B. Anda mungkin perlu memperhitungkan "offset" zona waktu dari UTC dalam melakukan penghitungan semacam itu. MySQL akan menginterpretasikan nilai DATETIME seperti yang ditentukan dalam time_zone
pengaturan sesi MySQL saat ini, bukan UTC (time_zone = '+00:00'
)
TINDAK LANJUT:
T: Oke, Berarti jika kita memilih tanggal di bawah '1970-01-01 00:00:00' maka nilai negatif disimpan dalam db jika tidak maka akan menjadi positif. Benar? – Genik lembut
J: Uhh, tidak. Jika Anda memilih nilai tanggal/waktu sebelum 1 Januari 1970, MySQL akan mengembalikan nilai DATE atau DATETIME sebelum 1 Januari 1970. Jika Anda menyimpan nilai DATE atau DATETIME sebelum 1 Januari 1970, maka MySQL akan menyimpan nilai DATE atau DATETIME sebelum 1 Januari , 1970, dalam rentang yang diizinkan yang didukung oleh tipe data tersebut. (seperti 0001-01-01 hingga 9999?)
Jika Anda perlu menyimpan bilangan bulat positif dan negatif yang sangat besar dalam database, kemungkinan besar Anda akan menyimpannya dalam kolom yang didefinisikan sebagai BIGINT
.
Representasi internal kolom DATE membutuhkan penyimpanan 3 byte, dan DATETIME membutuhkan penyimpanan 8 byte (hingga MySQL versi 5.6.4. Representasi internal dan penyimpanan nilai DATE dan DATETIME diubah di 5.6.4)
Jadi tidak, MySQL tidak menyimpan nilai tanggal sebelum 1970 sebagai "bilangan bulat negatif".
Jika Anda memikirkannya sedikit, MySQL bebas untuk mengimplementasikan mekanisme penyimpanan apa pun yang mereka inginkan. (Dan setiap mesin penyimpanan bebas membuat serial representasi itu ke disk sesukanya.)
Mengapa 3 byte untuk sebuah kencan?
Salah satu opsi yang dimiliki MySQL (dan saya tidak menyatakan bahwa ini adalah cara yang dilakukan) dapat memecah tanggal menjadi komponen tahun bulan dan hari.
Representasi nilai integer dalam rentang - membutuhkan -
-
0 - 9999 -
14 bit -
0 - 12 -
4 bit -
0 - 31 -
5 bit
Itu total 23 bit, yang kebetulan cocok dengan 3 byte. Ini hanya menunjukkan bahwa MySQL tidak perlu merepresentasikan nilai tanggal sebelum 1 Januari 1970 sebagai bilangan bulat negatif, jadi kita tidak boleh berasumsi demikian. (Tapi kami hanya akan memperhatikan tingkat detail ini jika kami sedang mengerjakan mesin penyimpanan untuk MySQL.)