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();
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:
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-fifts.html#feft_date-add
Đố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
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.
current_timestamp
thay vìcurrent_date
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 BETWEEN
nế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.
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
BETWEEN
và >=
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, tomorrow
hồ 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
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
Bạn cũng có thể dùng
select CURDATE()-INTERVAL 30 DAY
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.
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();
Vì 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
.
interval
có 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.
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?
subdate
rằ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ì?
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).