MySQL chọn ngày hôm qua


101

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

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ị bao nhiêu URL có nhiều URL tồn tại trong bảng và bao nhiêu URL đó đã được truy cập vào ngày 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ề ngày hôm qua, nhưng tôi không có ý tưởng về việc đếm số lần một URL đã tồn tại trong ngày hôm qua và đếm số lần một URL đã tồn tại trong bảng.

Câu trả lời:


165

Cách đơn giản và tốt nhất để biết 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 những người tò mò, lý do sum(condition)cung cấp cho bạn số lượng hàng thỏa mãn điều kiện, nếu không sẽ yêu cầu một casecâu lệnh rườm rà và dài dòng , là trong các giá trị boolean của mysql là 1true và 0false, vì vậy tính tổng một điều kiện có hiệu quả bao nhiêu lần đúng rồi. Sử dụng mẫu này có thể làm gọn gàng mã SQL của bạn.


89
SELECT SUBDATE(NOW(),1);

trong đó hàm now () lặp lại ngày và giờ hiện tại của hệ thống trong Timestamp ...

bạn có thể dùng:

SELECT SUBDATE(CURDATE(),1)

3
Đã làm cho tôi. Cảm ơn nhiều
mable george

20

Bạn có thể dùng:

SELECT SUBDATE(NOW(), 1);

hoặc là

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

hoặc là

SELECT NOW() - INTERVAL 1 DAY;

hoặc là

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

11

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

SELECT * FROM your_table

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

9

Truy vấn cho những tuần trước:

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

9

Cách tính ngày, tuần, tháng và năm cuối cùng hoặc tiếp theo. Nó có thể hữu ích cho bất kỳ ai.

Ngay hiện tại:

select curdate();

Hôm qua:

select subdate(curdate(), 1)

Ngày mai:

select adddate(curdate(), 1)

1 tuần trước:

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

1 tuần tới:

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

1 tháng trước:

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

1 tháng tới:

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

Tháng này:

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

1 năm qua:

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

1 năm tới:

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

7

Mặc dù câu trả lời đã chọn là chính xác và ngắn gọn hơn, tôi sẽ tranh luận về cấu trúc được lưu ý trong các 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 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 CASTso với SUBDATECASTcú pháp ANSI SQL. SUBDATElà một triển khai cụ thể của MySQL của thành phần số học ngày của CAST. Tập thói quen sử dụng cú pháp ANSI có thể giảm đau đầu nếu bạn phải chuyển sang một cơ sở dữ liệu khác. Cũng rất tốt nếu bạn có thói quen như một thông lệ chuyên nghiệp vì bạn gần như chắc chắn sẽ làm việc với các DBMS khác trong tương lai.

Không có hệ thống DBMS chính nào hoàn toàn tuân thủ ANSI, nhưng hầu hết trong số chúng thực hiện tập hợp rộng rãi cú pháp ANSI trong khi gần như không có hệ thống nào bên ngoài MySQL và các hệ thống con của nó (MariaDB, Percona, v.v.) sẽ triển khai cú pháp dành riêng cho MySQL.


Giải thích tốt về lý do tại sao người ta chọn cái này hơn cái kia.
Sablefoste

4

Tôi đã điều chỉnh một trong những câu trả lời trên từ cdhowie vì tôi không thể làm cho nó hoạt động. Điều này dường như làm việc cho tôi. Tôi nghi ngờ cũng có thể thực hiện việc này với hàm 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));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.