Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengonversi nilai negatif dari FROM_UNIXTIME

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.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mengapa ini tidak menarik data dari 7 hari yang lalu?

  2. MySQL Workbench tidak menampilkan hasil kueri

  3. Karakter apa yang harus diloloskan untuk mencegah injeksi SQL (Saya)?

  4. Kolom Pembaruan MySQL dari kolom lain di tabel yang sama

  5. Bisakah MySQL FIND_IN_SET atau yang setara dibuat menggunakan indeks?