Bagaimana cara mengetahui perbedaan hari antara 2 tanggal di SQLite? Saya sudah mencoba sesuatu seperti ini:
SELECT Date('now') - DateCreated FROM Payment
Ia mengembalikan 0 setiap kali.
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
DateCreated
dalam UTC. Sebaliknya, jika ini adalah waktu lokal, Anda harus mengonversijulianday('now')
ke waktu lokal. Saya tidak dapat menemukan tempat yang memiliki informasi ini. Jika Andajulianday('now') - julianday(DateCreated)
menyukai posting ini menyarankan dengan tanggal yang disimpan dalam waktu lokal, jawaban Anda akan dikesampingkan dari GMT dan akan salah. Meskipun mungkin bukan praktik terbaik untuk menyimpan tanggal dalam waktu lokal, ini masih dapat terjadi di aplikasi di mana zona waktu tidak penting (kecuali saat alat yang Anda gunakan memaksanya, seperti di sini).julianday('now') - julianday(DateCreated, 'utc')
, untuk membuat kedua UTC, cara kerjanya tidak samajulianday('now', 'localtime') - julianday(DateCreated)
. Yang pertama tidak memperhitungkan hari DST dan akan menambahkan satu jam ekstra ke tanggal yang dibuat pada Mar-Nov. Yang terakhir sebenarnya menjelaskannya. stackoverflow.com/questions/41007455/…Perbedaan Dalam Hari
Perbedaan Dalam Jam
Selisih Dalam Menit
Selisih Dalam Detik
sumber
Kedua jawaban tersebut memberikan solusi yang sedikit lebih kompleks, sebagaimana mestinya. Katakanlah pembayaran dilakukan pada
January 6, 2013
. Dan kami ingin mengetahui perbedaan antara tanggal ini dan hari ini.Perbedaannya adalah 34 hari. Kita bisa gunakan
julianday('now')
untuk kejelasan yang lebih baik. Dengan kata lain, kita tidak perlu meletakkandate()
ataudatetime()
berfungsi sebagai parameter agar bisajulianday()
berfungsi.sumber
Dokumentasi SQLite adalah referensi yang bagus dan halaman DateAndTimeFunctions adalah salah satu yang bagus untuk ditandai.
Ini juga membantu untuk diingat bahwa cukup mudah untuk bermain dengan kueri dengan utilitas baris perintah sqlite:
sumber
Jawaban ini agak bertele-tele, dan dokumentasinya tidak akan memberi tahu Anda hal ini (karena mereka menganggap Anda menyimpan tanggal Anda sebagai tanggal UTC di database), tetapi jawaban untuk pertanyaan ini sangat bergantung pada zona waktu tempat tanggal Anda disimpan di. Anda juga tidak menggunakan
Date('now')
, tetapi menggunakanjulianday()
fungsi tersebut, untuk menghitung kedua tanggal mundur terhadap tanggal yang sama, lalu kurangi selisih hasil tersebut satu sama lain.Jika tanggal Anda disimpan dalam UTC:
Inilah yang dimiliki jawaban peringkat teratas, dan juga ada dalam dokumentasi . Itu hanya sebagian dari gambaran, dan jawaban yang sangat sederhana, jika Anda bertanya kepada saya.
Jika tanggal Anda disimpan dalam waktu lokal, menggunakan kode di atas akan membuat jawaban Anda SALAH menurut jumlah jam offset GMT Anda. Jika Anda berada di AS bagian Timur seperti saya, yaitu GMT -5, hasil Anda akan ditambahkan 5 jam ke dalamnya. Dan jika Anda mencoba
DateCreated
menyesuaikan dengan UTC karenajulianday('now')
bertentangan dengan tanggal GMT:Ini memiliki bug di mana ia akan menambahkan satu jam untuk
DateCreated
itu selama Daylight Savings Time (Maret-November). Katakanlah bahwa "sekarang" adalah siang hari pada hari non-DST, dan Anda membuat sesuatu di bulan Juni (selama DST) pada siang hari, hasil Anda akan memberikan selisih 1 jam, bukan 0 jam, untuk bagian jam. Anda harus menulis fungsi dalam kode aplikasi Anda yang menampilkan hasil untuk mengubah hasil dan mengurangi satu jam dari tanggal DST. Saya melakukan itu, sampai saya menyadari ada solusi yang lebih baik untuk masalah yang saya alami: SQLite vs. Oracle - Menghitung perbedaan tanggal - jamSebaliknya, seperti yang ditunjukkan kepada saya, untuk tanggal yang disimpan dalam waktu lokal, buat keduanya cocok dengan waktu setempat:
Atau tambahkan
'Z'
waktu setempat:Kedua hal tersebut seakan mengimbangi dan tidak menambah jam ekstra untuk tanggal DST dan melakukan pengurangan langsung - sehingga barang yang dibuat pada siang hari pada hari DST, saat dilakukan pengecekan pada siang hari pada hari non-DST, tidak akan mendapat jam ekstra saat melakukan perhitungan.
Dan sementara saya tahu sebagian besar akan mengatakan jangan simpan tanggal dalam waktu lokal di database Anda, dan menyimpannya di UTC sehingga Anda tidak mengalami hal ini, tapi tidak setiap aplikasi memiliki audiens di seluruh dunia, dan tidak setiap programmer menginginkannya. untuk melalui konversi SETIAP tanggal dalam sistem mereka ke UTC dan kembali lagi setiap kali mereka melakukan GET atau SET di database dan berurusan dengan mencari tahu apakah sesuatu itu lokal atau dalam UTC.
sumber
Sekadar catatan untuk menulis fungsi timeclock. Bagi mereka yang mencari jam kerja, perubahan yang sangat sederhana adalah jam ditambah menit ditampilkan sebagai persentase dari 60 seperti yang diinginkan sebagian besar perusahaan penggajian.
CAST ((julianday(clockOUT) - julianday(clockIN)) * 24 AS REAL) AS HoursWorked
sumber
Jika Anda menginginkan waktu dalam format 00:00: Saya menyelesaikannya seperti itu:
sumber
Mengingat bahwa format tanggal Anda mengikuti: "YYYY-MM-DD HH: MM: SS", jika Anda perlu menemukan perbedaan antara dua tanggal dalam jumlah bulan:
(strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))
sumber
Pertama, tidak jelas apa format tanggal Anda. Sudah ada jawaban yang melibatkan
strftime("%s")
.Saya ingin memperluas jawaban itu.
SQLite hanya memiliki kelas penyimpanan berikut: NULL, INTEGER, REAL, TEXT atau BLOB. Untuk menyederhanakan, saya akan berasumsi tanggal NYATA berisi detik sejak 1970-01-01. Berikut adalah contoh skema yang akan saya masukkan ke dalam contoh data "1 Desember 2018":
Sekarang mari kita cari tahu perbedaan tanggal antara "1 Desember 2018" dan sekarang (saat saya menulis ini, sekarang adalah tengah hari 12 Desember 2018):
Perbedaan tanggal dalam hari:
Perbedaan tanggal dalam jam:
Perbedaan tanggal dalam menit:
Perbedaan tanggal dalam hitungan detik:
sumber
Jika Anda menginginkan perbedaan dalam hitungan detik
sumber
Jika Anda ingin rekaman di antara hari-hari,
sumber
Dalam kasus saya, saya harus menghitung perbedaan dalam menit dan
julianday()
tidak memberikan nilai yang akurat. Sebagai gantinya, saya menggunakanstrftime()
:SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60
Kedua tanggal diubah menjadi waktu unix (detik), kemudian dikurangi untuk mendapatkan nilai dalam hitungan detik antara kedua tanggal tersebut. Selanjutnya, bagi dengan 60.
https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions
sumber