Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara Menghitung Perbedaan Antara Dua Datetime di T-SQL

Masalah:

Anda memiliki dua kolom dengan tipe datetime 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 (selisih dalam hitungan detik):

PILIH id, keberangkatan, kedatangan, TANGGAL(kedua, 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 selisih antara arrival dan keberangkatan di T-SQL, gunakan DATEDIFF(datepart, startdate, enddate) fungsi. datepart argumen bisa microsecond , second , minute , hour , day , week , month , quarter , atau year . Di sini, Anda ingin mendapatkan perbedaan dalam hitungan detik, jadi pilih yang kedua. Untuk mendapatkan perbedaan jam, pilih hour; untuk perbedaan bulan, pilih month , dll. startdate dan enddate argumen adalah datetime awal dan akhir kolom, masing-masing (di sini, departure dan arrival , masing-masing).

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

DENGAN perbedaan_dalam_detik AS ( ID PILIH, keberangkatan, kedatangan, TANGGAL(DETIK, keberangkatan, kedatangan) AS detik DARI perjalanan),perbedaan AS ( ID PILIH, keberangkatan, kedatangan, detik, detik % 60 AS detik_bagian, detik % 3600 AS menit_bagian, detik % (3600 * 24) AS hours_part FROM difference_in_seconds)PILIH id, keberangkatan, kedatangan, CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' hours ', FLOOR(minutes_part / 60), ' menit ', detik_bagian, ' 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 selisih antara arrival dan departure dalam hitungan detik, menggunakan DATEDIFF() fungsi (CTE pertama, bernama difference_in_seconds ), seperti pada Solusi 1. Kemudian, 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 operator %. Misalnya, satu jam memiliki 3600 detik, jadi untuk mencari berapa detik yang ada di minutes_part , cari sisa dari pembagian 3600 seperti ini:

seconds % 3600 AS minutes_part

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

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 ini (yaitu, tanpa bagian desimal), jadi gunakan FLOOR() fungsinya 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 datetime perbedaan sebagai teks. Anda dapat dengan mudah memodifikasi solusi untuk mendapatkan hanya angka tanpa teks apa pun. Anda juga dapat menyimpan hari, jam, menit, dan detik di kolom yang berbeda:

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. Cara Membulatkan Angka ke Integer Terdekat di SQL

  2. SQL ANTARA Operator untuk Pemula

  3. FrankenQueries:ketika SQL dan NoSQL bertabrakan

  4. Cara Melepas Tabel dan Kolom dengan SQL

  5. Perbedaan antara Inner join dan Outer join di SQL