SQLite ini:
date(date, '-' || strftime('%w', date) || ' days')
Adalah, AFAIK, mengurangkan jumlah hari dalam seminggu (yaitu 0 untuk Minggu, 1 untuk Senin, ...) dari date
dan kemudian mengonversi hasilnya kembali ke date
; lihat referensi fungsi tanggal
untuk detailnya.
Saya pikir yang setara untuk PostgreSQL adalah:
d - extract(dow from d)::int
dimana d
adalah tanggal Anda; mengurangkan bilangan bulat dari tanggal mengurangi jumlah hari itu. Jika d
adalah stempel waktu, maka Anda mungkin perlu menambahkan beberapa casting. Ada date_trunc('week', 'd')
juga, tapi itu mulai menghitung hari dari Senin sehingga Anda tidak perlu menghitungnya.
Berikut rincian singkat dari SQLite dengan date
variabel diganti dengan d
untuk menghindari kebingungan dengan date()
fungsi:
date(d, '-' || strftime('%w', d) || ' days')
Pertama-tama, ||
adalah operator rangkaian string SQL standar. strftime
fungsi
adalah pemformat tanggal dan waktu tujuan umum yang berasal dari POSIX
; %w
penentu format berarti "hari dalam seminggu sebagai angka dengan hari Minggu sebagai hari nol"; jadi strftime
call memberi Anda 0 untuk hari Minggu, 1 untuk Senin, dan seterusnya hingga 6 untuk Sabtu. Jika d
adalah hari Selasa, maka strftime
panggilan akan menghasilkan 2 dan semuanya berakhir sebagai:
date(d, '-2 days')
Pengubah untuk date
SQLite fungsi
memiliki berbagai bentuk tetapi '-2 days'
artinya persis seperti yang Anda pikirkan:kurangi dua hari dari d
. Hasil keseluruhannya adalah Anda mendapatkan d
dipotong menjadi minggu (di mana hari Minggu dianggap sebagai hari pertama dalam seminggu).
Di sisi PostgreSQL:
d - extract(dow from d)::int
kita bisa mulai dengan extract
; extract
digunakan untuk mengekstrak bagian tertentu dari tanggal atau waktu dan dow
berarti "hari dalam seminggu sebagai angka dengan hari Minggu menjadi hari nol". Terdengar akrab? Kemudian ::int
melemparkan nomor DOW ke bilangan bulat dan diperlukan karena DOW sebenarnya keluar sebagai nilai presisi ganda dan tidak ada operator yang ditentukan untuk mengurangkan ganda dari tanggal di PostgreSQL; pemeran juga dapat ditulis dalam bentuk standar sebagai cast(x as int)
. Saat Anda mengurangi bilangan bulat dari tanggal di PostgreSQL, Anda mengurangi hari itu; Anda bisa lebih eksplisit dengan mengatakan hal-hal seperti - interval '3 days'
tapi itu hanya akan menambah lebih banyak kebisingan dalam kasus ini jadi saya memilih kesederhanaan. Jika hari Selasa, maka versi PostgreSQL kami terlihat seperti:
d - 2
dan itu sama dengan:
d - interval '2 days'
Dan setelah pengurangan kami akan kembali pada hari Minggu. Ada juga date_trunc
di PostgreSQL tapi itu akan terpotong menjadi Senin bukan Minggu.