MySQL memilih tanggal kemarin

102

Bagaimana saya bisa menampilkan dan menghitung nilai yang tanggalnya kemarin? Saya biasa time()memasukkan tanggal di database. Contoh:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

Saya ingin menampilkan berapa banyak URL yang memiliki beberapa yang ada di tabel dan juga berapa banyak dari URL tersebut yang telah dikunjungi kemarin. Contoh hasil:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

Saya sudah punya ide untuk mendapatkan tanggal kemarin, tapi saya tidak punya ide untuk menghitung berapa kali URL sudah ada kemarin dan menghitung berapa kali URL sudah ada di tabel.

PinoyStackOverflower
sumber

Jawaban:

167

Cara termudah dan terbaik untuk mendapatkan tanggal kemarin adalah:

subdate(current_date, 1)

Pertanyaan Anda adalah:

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

Bagi yang penasaran, alasan yang sum(condition)memberi Anda jumlah baris yang memenuhi kondisi, yang jika tidak memerlukan pernyataan rumit dan bertele-tele case, adalah bahwa dalam mysql nilai boolean adalah 1untuk benar dan 0salah, jadi menjumlahkan suatu kondisi secara efektif menghitung berapa kali itu benar. Menggunakan pola ini dapat merapikan kode SQL Anda.

Bohemian
sumber
91
SELECT SUBDATE(NOW(),1);

di mana now () berfungsi mengembalikan tanggal dan waktu saat ini dari sistem di Timestamp ...

kamu bisa memakai:

SELECT SUBDATE(CURDATE(),1)
Romancha KC
sumber
3
Bekerja untuk saya. Terima kasih banyak
mable george
21

Kamu bisa memakai:

SELECT SUBDATE(NOW(), 1);

atau

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

atau

SELECT NOW() - INTERVAL 1 DAY;

atau

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
simhumileco.dll
sumber
11

Anda bisa mendapatkan tanggal kemarin dengan menggunakan ekspresi CAST(NOW() - INTERVAL 1 DAY AS DATE). Jadi sesuatu seperti ini mungkin berhasil:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
cdhowie.dll
sumber
9

Kueri untuk minggu terakhir:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
NCrash
sumber
9

Perhitungan tanggal, minggu, bulan & tahun terakhir atau berikutnya. Mungkin bermanfaat bagi siapa saja.

Tanggal sekarang:

select curdate();

Kemarin:

select subdate(curdate(), 1)

Besok:

select adddate(curdate(), 1)

1 minggu terakhir:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

1 minggu berikutnya:

between adddate(curdate(), 7) and adddate(curdate(), 1)

1 bulan terakhir:

between subdate(curdate(), 30) and subdate(curdate(), 1)

1 bulan berikutnya:

between adddate(curdate(), 30) and adddate(curdate(), 1)

Bulan berjalan:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

1 tahun terakhir:

between subdate(curdate(), 365) and subdate(curdate(), 1)

1 tahun berikutnya:

between adddate(curdate(), 365) and adddate(curdate(), 1)
Atequer Rahman
sumber
7

Meskipun jawaban yang dipilih benar dan lebih ringkas, saya akan memperdebatkan struktur yang dicatat dalam jawaban lain:

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

Jika Anda hanya perlu tanggal telanjang tanpa stempel waktu, Anda juga dapat menuliskannya sebagai berikut:

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

Alasan menggunakan CASTversus SUBDATEadalah CASTsintaks ANSI SQL. SUBDATEadalah implementasi spesifik MySQL dari komponen aritmatika tanggal CAST. Membiasakan diri menggunakan sintaks ANSI dapat mengurangi sakit kepala jika Anda harus bermigrasi ke database yang berbeda. Juga bagus untuk membiasakan diri sebagai praktik profesional karena Anda hampir pasti akan bekerja dengan DBMS lain di masa mendatang.

Tak satu pun dari sistem DBMS utama yang sepenuhnya sesuai dengan ANSI, tetapi kebanyakan dari mereka mengimplementasikan kumpulan sintaks ANSI yang luas sedangkan hampir tidak ada dari mereka di luar MySQL dan turunannya (MariaDB, Percona, dll) yang akan mengimplementasikan sintaks khusus MySQL.

trclark81.dll
sumber
Penjelasan yang bagus tentang mengapa seseorang akan memilih salah satu dari yang lain.
Sablefoste
4

Saya mengadaptasi salah satu jawaban di atas dari cdhowie karena saya tidak bisa membuatnya berfungsi. Sepertinya ini berhasil untuk saya. Saya menduga itu juga mungkin untuk melakukan ini dengan fungsi UNIX_TIMESTAMP telah digunakan.

SELECT * FROM your_table

WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
John-Paul Stanford
sumber