MySQL dünün tarihini seçiyor


104

Tarihleri ​​dün olan değerleri nasıl görüntüleyebilir ve sayabilirim? Kullandığım time()veritabanında tarih ekleyin. Misal:

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

Tabloda birden fazla URL bulunan ve dün bu URL’lerden kaçının ziyaret edildiğini görüntülemek istiyorum. Örnek sonuç:

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

Dünün tarihini alma fikrim zaten var, ancak dün için bir URL'nin kaç kez bulunduğunu ve tabloda bir URL'nin kaç kez bulunduğunu sayma konusunda hiçbir fikrim yok.

Yanıtlar:


170

Dünün tarihini almanın en basit ve en iyi yolu şudur:

subdate(current_date, 1)

Sorgunuz şöyle olacaktır:

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

Meraklı için, nedeni sum(condition)verir sayımı aksi bir hantal ve ağız gerektirecektir koşulu tatmin satırların caseaçıklama, mysql boolean değerler olmasıdır 1doğrudur ve 0kaç kez bu kadar etkili bir şekilde sayar bir durumun toplayarak, yalancı için bu doğru. Bu kalıbı kullanmak SQL kodunuzu düzenleyebilir.


92
SELECT SUBDATE(NOW(),1);

now () işlevi, Zaman Damgasında sistemin geçerli tarih ve saatini döndürür ...

kullanabilirsiniz:

SELECT SUBDATE(CURDATE(),1)

3
Benim için çalıştı. Çok teşekkürler
mable george

21

Kullanabilirsiniz:

SELECT SUBDATE(NOW(), 1);

veya

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

veya

SELECT NOW() - INTERVAL 1 DAY;

veya

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

12

İfadeyi kullanarak dünün tarihini alabilirsiniz CAST(NOW() - INTERVAL 1 DAY AS DATE). Yani bunun gibi bir şey işe yarayabilir:

SELECT * FROM your_table

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

9

Son haftalar için sorgu:

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

9

Son veya sonraki tarih, hafta, ay ve yıl hesaplaması. Herkes için yararlı olabilir.

Geçerli tarih:

select curdate();

Dün:

select subdate(curdate(), 1)

Yarın:

select adddate(curdate(), 1)

Son 1 hafta:

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

Önümüzdeki 1 hafta:

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

Son 1 ay:

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

Önümüzdeki 1 ay:

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

İçinde bulunduğumuz ay:

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

Son 1 yıl:

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

Önümüzdeki 1 yıl:

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

7

Seçilen cevap doğru ve daha kısa olsa da, diğer cevaplarda belirtilen yapıyı savunuyorum:

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));

Zaman damgası olmayan çıplak bir tarihe ihtiyacınız varsa, bunu aşağıdaki gibi de yazabilirsiniz:

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

Kullanılmasının sebebi CASTkarşı SUBDATEDİR CASTANSI SQL sözdizimi. SUBDATEtarih aritmetik bileşeninin MySQL'e özgü bir uygulamasıdır CAST. ANSI sözdizimini kullanma alışkanlığı edinmek, farklı bir veritabanına geçmeniz gerektiğinde baş ağrısını azaltabilir. Gelecekte neredeyse kesinlikle diğer DBMS'lerle çalışacağınız için, profesyonel bir uygulama olarak alışkanlık içinde olmak da iyidir.

Ana DBMS sistemlerinden hiçbiri tam olarak ANSI uyumlu değildir, ancak çoğu geniş ANSI sözdizimi setini uygularken, MySQL ve onun soyundan gelenlerin (MariaDB, Percona, vb.) Neredeyse hiçbiri MySQL'e özgü sözdizimini uygulayamaz.


Neden birinin diğerine tercih ettiğine dair iyi açıklamalar.
Sablefoste

4

Yukarıdaki cevaplardan birini cdhowie'den uyarladım çünkü işe yaramadı. Bu benim için çalışıyor gibi görünüyor. Bunu UNIX_TIMESTAMP işlevi kullanılmış olarak yapmanın da mümkün olduğundan şüpheleniyorum.

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));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.