Server tabel Oracle menawarkan fungsi built-in TRUNC(timestamp,'DY')
,. Fungsi ini mengonversi stempel waktu menjadi tengah malam pada hari Minggu sebelumnya. Apa cara terbaik untuk melakukannya di MySQL?
Oracle juga menawarkan TRUNC(timestamp,'MM')
untuk mengubah stempel waktu menjadi tengah malam pada hari pertama bulan saat itu terjadi. Di MySQL, yang ini sangat mudah:
TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))
Tetapi DATE_FORMAT
trik ini tidak akan berhasil selama berminggu-minggu. Saya mengetahui WEEK(timestamp)
fungsinya, tetapi saya benar-benar tidak ingin nomor minggu dalam tahun ini; barang ini untuk pekerjaan bertahun-tahun.
TRUNC(date, 'DY' )
mendapat berminggu-minggu dengan hari Minggu mulai.'W'
mendapat awal hari Senin, setidaknya di sistem saya.Jawaban:
Anda dapat menggunakan
YEAR(timestamp)
danWEEK(timestamp)
, dan menggunakan kedua ekspresi ini di dalamSELECT
danGROUP BY
klausa.Tidak terlalu elegan, tapi fungsional ...
Dan tentu saja Anda juga dapat menggabungkan dua bagian tanggal ini dalam satu ekspresi, yaitu seperti
SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc... FROM ... WHERE .. GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))
Sunting : Seperti yang ditunjukkan Martin, Anda juga dapat menggunakan
YEARWEEK(mysqldatefield)
fungsi tersebut, meskipun hasilnya tidak ramah mata seperti rumus yang lebih panjang di atas.Sunting 2 [3 1/2 tahun kemudian!]:
YEARWEEK(mysqldatefield)
Dengan opsional argumen kedua (mode
) diatur ke 0 atau 2 mungkin adalah cara terbaik untuk menggabungkan dengan minggu lengkap (yaitu termasuk untuk minggu yang mengangkang selama 1 Januari), jika itu adalah apa yang diinginkan. TheYEAR() / WEEK()
Pendekatan awalnya diusulkan dalam jawaban ini memiliki efek membelah data dikumpulkan untuk seperti "mengangkangi" minggu di dua: satu dengan mantan tahun, satu dengan tahun baru.Potongan bersih setiap tahun, dengan biaya memiliki hingga dua minggu parsial, satu di kedua ujung, sering diinginkan dalam akuntansi, dll. Dan untuk itu
YEAR() / WEEK()
pendekatannya lebih baik.sumber
YEARWEEK()
hasilINT(6)
yang saya percaya akan lebih cepat untuk mengurutkan / bergabung / mengelompokkan denganJawaban yang diterima di atas tidak berhasil untuk saya, karena ini mengurutkan minggu berdasarkan urutan abjad, bukan urutan kronologis:
Inilah solusi saya untuk menghitung dan mengelompokkan berdasarkan minggu:
SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, YEAR(date), WEEK(date), COUNT(*) FROM column_name GROUP BY week_name ORDER BY YEAR(DATE) ASC, WEEK(date) ASC
Menghasilkan:
sumber
ORDER BY date ASC
) harus melakukan trik jugaMengetahui itu ... itu sedikit rumit, tapi ini dia.
Dan, jika aturan bisnis Anda menyatakan minggu Anda dimulai pada hari Senin, ubah
-1
menjadi-2
.Edit
Bertahun-tahun telah berlalu dan saya akhirnya sempat menulis ini. http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
sumber
Anda bisa mendapatkan nomor tahun dan minggu gabungan (200945) menggunakan fungsi YEARWEEK () . Jika saya memahami tujuan Anda dengan benar, itu memungkinkan Anda untuk mengelompokkan data multi-tahun Anda.
Jika Anda membutuhkan stempel waktu aktual untuk awal minggu, itu kurang bagus:
Untuk pemesanan bulanan, Anda dapat mempertimbangkan fungsi LAST_DAY () - sortir berdasarkan hari terakhir setiap bulan, tetapi itu harus setara dengan mengurutkan berdasarkan hari pertama bulan ... bukankah begitu?
sumber
Cukup iklan ini di pilih:
Dan
sumber
Jika Anda membutuhkan tanggal "akhir minggu", ini juga akan berfungsi. Ini akan menghitung jumlah rekaman untuk setiap minggu. Contoh: Jika tiga perintah kerja dibuat antara (inklusif) 1/2/2010 dan 1/8/2010 dan 5 dibuat antara (inklusif) 1/9/2010 dan 1/16/2010 ini akan menghasilkan:
3 1/8/2010
5 1/16/2010
Saya harus menggunakan fungsi DATE () ekstra untuk memotong bidang datetime saya.
SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending FROM work_order wo GROUP BY week_ending;
sumber