Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL Pilih 7 hari terakhir

WHERE klausa salah tempat, ia harus mengikuti referensi tabel dan operasi GABUNG.

Sesuatu seperti ini:

 FROM tartikel p1 
 JOIN tartikelpict p2 
   ON p1.kArtikel = p2.kArtikel 
  AND p2.nNr = 1
WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY
ORDER BY p1.kArtikel DESC

EDIT (tiga tahun ditambah kemudian)

Di atas pada dasarnya menjawab pertanyaan "Saya mencoba menambahkan klausa WHERE ke kueri saya dan sekarang kueri tersebut mengembalikan kesalahan, bagaimana cara memperbaikinya?"

Mengenai pertanyaan tentang menulis ketentuan yang memeriksa rentang tanggal "7 hari terakhir"...

Itu sangat bergantung pada interpretasi spesifikasi, tipe data kolom dalam tabel (DATE atau DATETIME) dan data apa yang tersedia... apa yang harus dikembalikan.

Untuk meringkas:pendekatan umum adalah mengidentifikasi "awal" untuk rentang tanggal/waktu, dan "akhir" dari rentang itu, dan merujuknya dalam kueri. Mari kita pertimbangkan sesuatu yang lebih mudah... semua baris untuk "kemarin".

Jika kolom kami adalah tipe DATE. Sebelum kita memasukkan ekspresi ke dalam kueri, kita bisa mengujinya dengan SELECT

 SELECT DATE(NOW()) + INTERVAL -1 DAY 

dan pastikan hasil yang dikembalikan sesuai dengan yang kita harapkan. Kemudian kita dapat menggunakan ekspresi yang sama dalam klausa WHERE, membandingkannya dengan kolom DATE seperti ini:

 WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY

Untuk kolom DATETIME atau TIMESTAMP, kita dapat menggunakan >= dan < perbandingan ketidaksetaraan untuk menentukan rentang

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

Untuk "7 hari terakhir" kita perlu tahu apakah itu berarti dari titik ini sekarang, 7 hari ke belakang ... mis. 7*24 jam terakhir , termasuk komponen waktu dalam perbandingan, ...

 WHERE datetimecol >= NOW() + INTERVAL -7 DAY
   AND datetimecol <  NOW() + INTERVAL  0 DAY

tujuh hari terakhir lengkap, tidak termasuk hari ini

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

atau enam hari terakhir ditambah hari ini ...

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
   AND datetimecol <  NOW()       + INTERVAL  0 DAY

Saya merekomendasikan menguji ekspresi di sisi kanan dalam pernyataan SELECT, kita dapat menggunakan variabel yang ditentukan pengguna sebagai ganti SEKARANG() untuk pengujian, tidak terikat dengan apa yang SEKARANG () kembali sehingga kita dapat menguji batas, lintas minggu/bulan /batas tahun, dan seterusnya.

SET @clock = '2017-11-17 11:47:47' ;

SELECT DATE(@clock)
     , DATE(@clock) + INTERVAL -7 DAY 
     , @clock + INTERVAL -6 DAY 

Setelah kami memiliki ekspresi yang mengembalikan nilai yang berfungsi untuk "mulai" dan "akhir" untuk kasus penggunaan khusus kami, yang kami maksud dengan "7 hari terakhir", kami dapat menggunakan ekspresi tersebut dalam perbandingan rentang dalam klausa WHERE.

(Beberapa pengembang lebih suka menggunakan DATE_ADD dan DATE_SUB berfungsi sebagai pengganti + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR sintaks.

Dan MySQL menyediakan beberapa fungsi yang nyaman untuk bekerja dengan tipe data DATE, DATETIME dan TIMESTAMP... DATE, LAST_DAY,

Beberapa pengembang lebih suka menghitung awal dan akhir dalam kode lain, dan menyediakan literal string dalam kueri SQL, sehingga kueri yang dikirimkan ke database adalah

  WHERE datetimecol >= '2017-11-10 00:00'
    AND datetimecol <  '2017-11-17 00:00'

Dan pendekatan itu juga berhasil. (Preferensi saya adalah secara eksplisit memasukkan literal string tersebut ke DATETIME, baik dengan CAST, CONVERT atau hanya trik + INTERVAL...

  WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
    AND datetimecol <  '2017-11-17 00:00' + INTERVAL 0 SECOND

Semua di atas mengasumsikan kita menyimpan "tanggal" dalam tipe data DATE, DATETIME dan/atau TIMESTAMP yang sesuai, dan tidak menyimpannya sebagai string dalam berbagai format mis. 'dd/mm/yyyy' , m/d/yyyy , tanggal julian, atau dalam format non-kanonik secara sporadis, atau dalam hitungan detik sejak awal zaman, jawaban ini perlu lebih lama.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO::PARAM untuk tipe desimal?

  2. SQL Perbarui dan ganti substring

  3. Bagaimana cara menggunakan GROUP BY untuk menggabungkan string di MySQL?

  4. Bagaimana memulihkan database Mysql dari file cadangan

  5. Bagaimana saya bisa terhubung ke MySQL di server WAMP?