Truy vấn sau đây:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
trả lại không có gì.
Tôi nên có quá nhiều dữ liệu để truy vấn hoạt động. Tôi đang làm gì sai?
Truy vấn sau đây:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
trả lại không có gì.
Tôi nên có quá nhiều dữ liệu để truy vấn hoạt động. Tôi đang làm gì sai?
Câu trả lời:
Ngày thứ hai của bạn là trước ngày đầu tiên của bạn (tức là bạn đang truy vấn từ ngày 29 tháng 9 năm 2010 đến ngày 30 tháng 1 năm 2010). Hãy thử đảo ngược thứ tự của ngày:
SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
where
mệnh đề nên hoạt động tương tự trên select
hoặc các update
câu lệnh.
Là date_field
loại datetime
? Ngoài ra, bạn cần đặt ngày tai nghe đầu tiên.
Nó nên là:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
DATE () là một hàm MySQL chỉ trích xuất phần ngày của biểu thức ngày hoặc ngày / thời gian
SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
Là phần mở rộng cho câu trả lời từ @sabin và một gợi ý nếu người ta chỉ muốn so sánh phần ngày (không có thời gian):
Nếu trường để so sánh là từ loại thời gian và chỉ ngày được chỉ định để so sánh, thì những ngày này được chuyển đổi nội bộ thành giá trị thời gian . Điều này có nghĩa là truy vấn sau đây
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')
sẽ được chuyển đổi thành
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')
nội bộ
Điều này dẫn đến một kết quả không bao gồm các đối tượng từ 2010-09-29 với giá trị thời gian lớn hơn 00:00:00!
Do đó, nếu bao gồm tất cả các đối tượng có ngày 2010-09-29, thì trường để so sánh phải được chuyển đổi thành ngày:
SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
Bạn có thể làm điều đó bằng tay, bằng cách so sánh với lớn hơn hoặc bằng và nhỏ hơn hoặc bằng.
select * from table_name where created_at_column >= lower_date and created_at_column <= upper_date;
Trong ví dụ của chúng tôi, chúng tôi cần lấy dữ liệu từ một ngày cụ thể hàng ngày. Chúng tôi sẽ so sánh từ đầu ngày đến giây mới nhất trong một ngày khác.
select * from table_name where created_at_column >= '2018-09-01 00:00:00' and created_at_column <= '2018-09-05 23:59:59';
Có thể là một vấn đề với cấu hình ngày ở phía máy chủ hoặc phía máy khách. Tôi thấy đây là một vấn đề phổ biến trên nhiều cơ sở dữ liệu khi máy chủ được cấu hình bằng tiếng Tây Ban Nha, tiếng Pháp hoặc bất cứ điều gì ... có thể ảnh hưởng đến định dạng dd / mm / yyyy hoặc mm / dd / yyyy.
Chỉ cần cast date_field là ngày
SELECT * FROM `objects`
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND
'2010-01-30' )
Khi sử dụng các giá trị Ngày và Giờ, bạn phải bỏ các trường thành DateTime
và không Date
. Thử :
SELECT * FROM `objects`
WHERE (CAST(date_field AS DATETIME)
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))
min
vàmax
các giá trị được coi là nằm trong phạm vi, để không xử lý hai lần một ngày là giá trịmin
vàmax
giá trị (trường hợp cạnh). Ví dụ, ngày2010-09-29 00:00:00
sẽ giữa2010-09-28 00:00:00
và2010-09-29 00:00:00
, VÀ CŨNG giữa2010-09-29 00:00:00
và2010-09-30 00:00:00