Soalan asal menggambarkan menggunakan SQL untuk membuat pertanyaan bagi rekod yang memenuhi julat waktu perniagaan tertentu dalam aplikasi ActiveRecord (RoR). Pertanyaan menggunakan keadaan kompleks untuk membandingkan titik masa semasa dengan nilai yang disimpan. Persoalannya menimbulkan persoalan sama ada ini boleh dilakukan dengan menukar nilai masa kepada beberapa jenis tarikh dan membiarkan PostgreSQL mengendalikan perbandingan.
Untuk menyelesaikan masalah ini, adalah disyorkan untuk menggunakan jenis data tsrange (julat masa) PostgreSQL untuk menyimpan waktu perniagaan. tsrange membolehkan anda menyimpan waktu perniagaan yang dinyatakan sebagai tempoh masa, dan PostgreSQL menyediakan fungsi dan pengendali terbina dalam untuk memanipulasi julat ini.
Untuk melakukan ini, anda perlu membuat perubahan skema pada jadual sedia ada:
ALTER TABLE hours_of_operations ALTER COLUMN opens_on TYPE TIMESTAMP ALTER COLUMN closes_on TYPE TIMESTAMP ALTER COLUMN opens_at TYPE TIME ALTER COLUMN closes_at TYPE TIME
Buat jam lajur baharu untuk menyimpan nilai tsrange:
ALTER TABLE hours_of_operations ADD COLUMN hours TSrange
Kemudian gunakan pernyataan berikut untuk mengemas kini waktu perniagaan Lajur:
UPDATE hours_of_operations SET hours = tsrange(opens_on || ' ' || opens_at, closes_on || ' ' || closes_at)
Selepas mengemas kini struktur jadual, anda boleh menulis pertanyaan SQL yang lebih ringkas dan cekap untuk memenuhi keperluan soalan asal:
SELECT * FROM hours_of_operations WHERE current_timestamp @> hours
Pertanyaan ini menggunakan pengendali @> untuk menyemak sama ada titik masa semasa berada dalam julat jam yang disimpan. Jika anda perlu mempertimbangkan isu zon waktu, gunakan fungsi masa yang sesuai untuk menukar masa semasa kepada UTC atau zon waktu lain yang dikehendaki.
Kelebihan menggunakan tsrange termasuk:
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyoal Waktu Perniagaan dengan Cekap dalam PostgreSQL Menggunakan `tsrange`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!