Làm thế nào để trừ 30 ngày kể từ thời gian hiện tại trong mysql?


194

Làm cách nào để trừ 30 ngày kể từ ngày hiện tại trong mysql?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();

Câu trả lời:



127

Đối với bất cứ ai không muốn sử dụng DATE_SUB, sử dụng CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY

2
Tôi sẽ cho +10 này nếu tôi có thể. SQL nên là tất cả về khả năng đọc và đây là cách dễ đọc nhất để làm điều này.
Colin 't Hart

9
Dễ đọc hơn nhưng kết quả khác so với sử dụng NOW() - INTERVAL 30 DAY. Vì câu hỏi đề cập đến "trừ 30 ngày kể từ thời gian hiện tại ", nó có thể không phải là điều OP muốn.
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ sau đó sử dụng current_timestampthay vìcurrent_date
isapir

21

Chúng ta không sử dụng NOW()vì bạn đang mất bất kỳ bộ nhớ đệm hoặc tối ưu hóa truy vấn nào vì truy vấn khác nhau mỗi lần. Xem danh sách các chức năng bạn không nên sử dụng trong tài liệu MySQL .

Trong mã dưới đây, giả sử bảng này đang phát triển theo thời gian. Nội dung mới được thêm vào và bạn muốn chỉ hiển thị nội dung trong 30 ngày qua. Đây là trường hợp phổ biến nhất.

Lưu ý rằng ngày đã được thêm dưới dạng chuỗi. Tốt hơn là thêm ngày theo cách này, từ mã cuộc gọi của bạn, hơn là sử dụng NOW()chức năng vì nó giết chết bộ nhớ đệm của bạn.

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

Bạn có thể sử dụng BETWEENnếu bạn thực sự chỉ muốn những thứ từ thứ hai đến 30 ngày trước thứ hai này, nhưng đó không phải là trường hợp sử dụng phổ biến trong kinh nghiệm của tôi, vì vậy tôi hy vọng truy vấn đơn giản có thể phục vụ tốt cho bạn.


3
Vì vậy, bạn đề xuất không sử dụng NOW()và vẫn sử dụng nó trong câu trả lời của bạn. o_O PS: truy vấn của bạn sẽ trả về một kết quả khác , không phải là điều OP có thể muốn
zerkms

@zerkms Làm thế nào truy vấn này sẽ tạo ra một tập kết quả khác với truy vấn của bạn?
dùng784637

2
@ user784637: uhm, BETWEEN>=các nhà khai thác khác nhau, bạn biết không? Truy vấn của tôi giới hạn kết quả được đặt cho 30 days ago AND today, điều này everything after 30 days ago. Vì vậy, tomorrowhồ sơ sẽ không khớp với câu hỏi của tôi và truy vấn ban đầu của bạn, nhưng sẽ khớp với câu trả lời này
zerkms

Ok, xấu của tôi. Thông thường các truy vấn như vậy là trong các bảng trực tiếp đang phát triển theo thời gian. Đó là lý do tại sao tôi bỏ giữa. Tôi đã làm rõ câu trả lời của tôi ở trên.
Joseph Lust

@JosephLust, Để giải quyết các vấn đề về hiệu suất, thay vào đó hãy sử dụng giải pháp của tôi .
Pacerier

17

MySQL trừ ngày kể từ bây giờ:

select now(), now() - interval 1 day

Bản in:

2014-10-08 09:00:56     2014-10-07 09:00:56

Các đối số Đơn vị Biểu thức Tạm thời Tạm thời khác:

https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-inter Khoảng

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 


1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

Bạn có thể định dạng bằng cách sử dụng định dạng ngày trong SQL.


0

cách khác

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;

0

Nếu bạn chỉ cần ngày và không sử dụng thời gian:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

curdate()bỏ qua thành phần thời gian, nó có khả năng nhanh hơn now()và "chính xác hơn về mặt ngữ nghĩa" trong trường hợp bạn chỉ quan tâm đến ngày.

Ngoài ra, subdate()quá tải 2 arity có khả năng nhanh hơn so với sử dụng interval. intervalcó nghĩa là dành cho các trường hợp khi bạn cần một thành phần không phải ngày.


11
Vì vậy, bạn đang tuyên bố rằng đó subdate(curdate(), 30)là hơn CURRENT_DATE - INTERVAL 30 DAY? Bạn có bằng chứng không? Và nó sẽ nhanh như thế nào? Vài micro giây?
ypercubeᵀᴹ

2
Tôi không có ý kiến. Tôi chắc chắn không thể nâng cao ý kiến ​​của riêng tôi. Về yêu cầu "có khả năng" nhanh hơn, tôi vẫn không thấy bằng chứng, quyết định hay tình huống nào. Và ngay cả khi nó có phần nhanh hơn, điều kiện sẽ được đánh giá một lần. Trừ khi bạn chạy truy vấn hàng triệu lần mỗi phút, sự khác biệt sẽ không thành vấn đề.
ypercubeᵀᴹ

2
Tôi đoán subdaterằng khả năng nhanh hơn có lẽ được giải thích bằng cách nào đó, theo ý kiến ​​của bạn, bởi "quá tải 2-arity" của nó, nhưng, xin vui lòng tha thứ cho tôi nếu đây là một câu hỏi ngu ngốc, những từ đó có nghĩa gì (đối với chức năng )? Đặc biệt, "2-arity" là gì?
Andriy M

1
Ngoài ra, theo như cách diễn đạt của câu hỏi, curdate()thực sự có thể là lựa chọn sai, bởi vì OP dường như muốn "trừ 30 ngày khỏi thời gian hiện tại " (nhấn mạnh của tôi).
Andriy M

1
@AndriyM, vì chủ đề này đang nhận được 50 nghìn lượt xem, tôi sẽ để lại câu trả lời ở đây cho những người chỉ quan tâm đến thành phần thời gian. Và liên quan đến "arity", nó đề cập đến số lượng đối số . Đúng vậy, đối với tất cả mọi thứ đều bằng nhau, hàm 2 arity có khả năng nhanh hơn hàm 3 arity. Điều đó sẽ đúng cho đến khi thông tin mới được thêm vào đĩa.
Pacerier
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.