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

Cara Menghitung Perbedaan Antara Dua Timestamp di MySQL

Masalah:

Anda memiliki dua kolom stempel waktu jenis dan Anda ingin menghitung perbedaan di antara keduanya.

Contoh:

Dalam travel tabel, ada tiga kolom:id , departure , dan arrival . Anda ingin menghitung selisih antara arrival dan departure .

travel tabel terlihat seperti ini:

id keberangkatan kedatangan
1 25-03-2018 12:00:00 05-04-2018 07:30:00
2 2019-09-12 15:50:00 23-10-2019 10:30:30
3 14-07-2018 16:15:00 14-07-2018 20:40:30
4 05-01-2018 08:35:00 08-01-2019 14:00:00

Solusi 1 (perbedaan hari, jam, menit, atau detik):

PILIH id, keberangkatan, kedatangan, TIMESTAMPDIFF(SECOND, keberangkatan, kedatangan) SEBAGAI perbedaanFROM perjalanan;

Hasilnya adalah:

id keberangkatan kedatangan perbedaan
1 25-03-2018 12:00:00 05-04-2018 07:30:00 934200
2 2019-09-12 15:50:00 23-10-2019 10:30:30 3523230
3 14-07-2018 16:15:00 14-07-2018 20:40:30 15930
4 05-01-2018 08:35:00 08-01-2019 14:00:00 31814700

Diskusi:

Untuk menghitung perbedaan antara timestamp di MySQL, gunakan TIMESTAMPDIFF(unit, start, end) fungsi. Argumen unit dapat berupa MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER , atau YEAR . Untuk mendapatkan perbedaan dalam hitungan detik seperti yang telah kita lakukan di sini, pilih SECOND . Untuk mendapatkan perbedaan dalam hitungan menit, pilih MINUTE; untuk perbedaan jam, pilih HOUR , dll. Argumen akhir dan awal masing-masing adalah stempel waktu akhir dan stempel waktu awal (di sini, departure dan arrival , respectively ).

Solusi 2 (perbedaan hari, jam, menit, dan detik):

DENGAN perbedaan_dalam_detik AS ( PILIH id, keberangkatan, kedatangan, TIMESTAMPDIFF(DETIK, keberangkatan, kedatangan) SEBAGAI detik DARI perjalanan), perbedaan SEBAGAI (PILIH id, keberangkatan, kedatangan, detik, MOD (detik, 60) SEBAGAI detik_bagian, MOD (detik, 3600) AS menit_bagian, MOD(detik, 3600 * 24) AS jam_bagian FROM perbedaan_dalam_detik)PILIH id, keberangkatan, kedatangan, CONCAT( LANTAI(detik / 3600 / 24), ' hari ', LANTAI(bagian_jam / 3600), ' jam ', LANTAI(bagian_menit / 60), ' menit ', bagian_detik, ' detik' ) SEBAGAI perbedaanFROM perbedaan;

Hasilnya adalah:

id keberangkatan kedatangan perbedaan
1 25-03-2018 12:00:00 05-04-2018 07:30:00 10 hari 19 jam 30 menit 0 detik
2 2019-09-12 15:50:00 23-10-2019 10:30:30 40 hari 18 jam 40 menit 30 detik
3 14-07-2018 16:15:00 14-07-2018 20:40:30 0 hari 4 jam 25 menit 30 detik
4 05-01-2018 08:35:00 08-01-2019 14:00:00 368 hari 5 jam 25 menit 0 detik

Diskusi:

Pertama, hitung perbedaan antara stempel waktu dalam detik, menggunakan TIMESTAMPDIFF() fungsi (CTE pertama, bernama difference_in_seconds ), seperti dalam Solusi 1. Hitung berapa detik yang lebih dari seluruh menit (seconds_part ) yang akan digunakan nanti untuk menghitung detik, berapa detik yang ada lebih dari seluruh jam (minutes_part ) yang akan digunakan nanti untuk menghitung menit, dan berapa detik yang melebihi jam penuh (hours_part ) yang akan digunakan nanti untuk menghitung jam.

Untuk melakukan ini, gunakan MOD() fungsi. Misalnya, satu jam memiliki 3600 detik, jadi untuk mencari berapa detik yang ada di minutes_part , cari sisa dari pembagian 3600 seperti ini:

MOD(seconds, 3600) AS minutes_part

Demikian pula, ada 3600 * 24 detik dalam sehari, jadi untuk menghitung berapa detik yang ada di hours_part , tulis:

MOD(seconds, 3600 * 24) AS hours_part

Setelah sisa ini dihitung (dalam CTE kedua, bernama differences ), Anda akhirnya bisa mendapatkan perbedaan dalam hari, jam, menit, dan detik. Untuk mendapatkan jumlah detik, menit, jam, dan hari, bagi jumlah detik di sisa dengan jumlah detik yang sesuai dalam hari, jam, atau menit. Misalnya, untuk mengetahui berapa menit yang harus ditampilkan, ambil minutes_part dan bagi dengan 60, karena ada 60 menit dalam satu jam. Anda hanya memerlukan bagian integer dari this (yaitu, tanpa bagian desimal), jadi gunakan fungsi FLOOR() seperti ini:

FLOOR(minutes_part / 60)

Terakhir, Anda hanya perlu menampilkan dalam satu string apa yang telah Anda hitung. Untuk melakukannya, gunakan CONCAT() fungsi dalam kueri luar:

CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' hours ', FLOOR(minutes_part / 60), ' minutes ', seconds_part, ' seconds' ) SEBAGAI perbedaan 

Solusi yang disajikan di sini mengembalikan kolom terakhir sebagai teks. Anda dapat dengan mudah memodifikasi solusi ini untuk menampilkannya dalam beberapa format lain. Anda juga dapat menampilkan angka dalam kolom terpisah, seperti ini:

LANTAN(detik / 3600 / 24) SEBAGAI hari, LANTAI(bagian_jam / 3600) AS jam, LANTAI(bagian_menit / 60) AS menit,bagian_detik AS detik

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memilih baris ke-n dalam tabel database SQL?

  2. Migrasi Langsung Menggunakan Replikasi MySQL

  3. Pertimbangan DevOps untuk Penerapan Basis Data Siap Produksi

  4. 2 Fungsi yang Mengembalikan Nama Bulan dari Tanggal di MySQL

  5. Jenis kesalahan sintaks tidak valid =MyISAM dalam DDL dihasilkan oleh Hibernate