2011-08-22 36 views
63

Tôi làm cách nào để hiển thị và đếm các giá trị có ngày hôm qua? Tôi đã sử dụng time() để chèn ngày trong cơ sở dữ liệu. Ví dụ:MySQL chọn ngày hôm qua

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

Tôi muốn hiển thị số lượng URL có nhiều trong bảng và số lượng URL đó đã được truy cập hôm qua. kết quả Ví dụ:

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

Tôi đã có ý tưởng về việc ngày hôm qua, nhưng tôi không có một ý tưởng về đếm bao nhiêu lần một URL đã tồn tại ngày hôm qua và đếm bao nhiêu lần một URL đã tồn tại trong bàn.

Trả lời

110

Cách đơn giản nhất và tốt nhất để có được ngày hôm qua là:

subdate(current_date, 1) 

truy vấn của bạn sẽ là:

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 

Đối với người hiếu, lý do rằng sum(condition) cung cấp cho bạn số số của các hàng thỏa mãn điều kiện, nếu không sẽ yêu cầu một số ít phức tạp và dài dòngTuyên bố, là trong các giá trị boolean mysql là 1 cho đúng và 0 cho sai, do đó, tổng hợp một điều kiện có hiệu quả đếm bao nhiêu lần nó là sự thật. Sử dụng mẫu này có thể gọn gàng mã SQL của bạn.

10

Bạn có thể nhận ngày hôm qua bằng cách sử dụng cụm từ CAST(NOW() - INTERVAL 1 DAY AS DATE). Vì vậy, một cái gì đó như thế này có thể làm việc:

SELECT * FROM your_table 

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

nơi bây giờ() chức năng returs ngày và thời gian của hệ thống trong Timestamp hiện tại ...

bạn có thể sử dụng:

SELECT SUBDATE(CURDATE(),1) 
+0

Làm việc cho tôi. Rất cám ơn –

3

tôi chuyển thể một trong những câu trả lời trên từ cdhowie vì tôi không thể khiến nó hoạt động. Điều này dường như làm việc cho tôi. Tôi nghi ngờ nó cũng có thể làm điều này với chức năng UNIX_TIMESTAMP được sử dụng.

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

Đã có cùng một vấn đề, điều này làm việc cho tôi. – Chris

6

Query cho những tuần cuối cùng:

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

Trong khi câu trả lời được lựa chọn là chính xác và ngắn gọn hơn, tôi muốn tranh luận cho cấu trúc lưu ý trong câu trả lời khác:

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

Nếu bạn chỉ cần một ngày trống mà không có dấu thời gian, bạn cũng có thể viết nó như sau:

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

Lý do sử dụng CAST so với SUBDATECAST là cú pháp SQL ANSI. SUBDATE là một triển khai cụ thể của MySQL về thành phần số học ngày của CAST. Bắt gặp thói quen sử dụng cú pháp ANSI có thể giảm đau đầu nếu bạn phải di chuyển sang cơ sở dữ liệu khác.Nó cũng tốt để được trong thói quen như là một thực hành chuyên nghiệp như bạn gần như chắc chắn sẽ làm việc với DBMS khác 'trong tương lai.

Không có hệ thống DBMS nào tuân thủ đầy đủ ANSI, nhưng hầu hết trong số chúng thực hiện cú pháp ANSI trong khi gần như không có ai trong số chúng ngoài MySQL và con cháu của nó (MariaDB, Percona, v.v.) .

+0

Giải thích tốt về lý do tại sao người ta chọn một người khác. – Sablefoste

5

Bạn có thể sử dụng:

SELECT SUBDATE(NOW(), 1); 

hoặc

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

hoặc

SELECT NOW() - INTERVAL 1 DAY; 

hoặc

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY); 
Các vấn đề liên quan