Làm cách nào để truy vấn giữa hai ngày bằng MySQL?


225

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?


32
Hãy thận trọng với GIỮA, vì cả hai minmaxcá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ị minmaxgiá trị (trường hợp cạnh). Ví dụ, ngày 2010-09-29 00:00:00sẽ giữa 2010-09-28 00:00:002010-09-29 00:00:00 , VÀ CŨNG giữa 2010-09-29 00:00:002010-09-30 00:00:00
minipif

vâng, những gì anh ấy đã nói ^^
Albert Rannetsperger 04/11/2016

Câu trả lời:


472

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

Tôi đã biết điều này nhưng bây giờ có vấn đề với CẬP NHẬT. Tôi đang cố gắng sử dụng GIỮA cho CẬP NHẬT để nó hoạt động theo cùng một cách?
Ingus

3
@IngusGraholskis: một wheremệnh đề nên hoạt động tương tự trên selecthoặc các updatecâu lệnh.
T30

Cá nhân, tôi thấy thuật ngữ 'từ' và 'đến' một cách lén lút để ghi nhớ thứ tự mà truy vấn nên được viết.
KeaganFouche

Làm thế nào để trả về tất cả dữ liệu nếu cả hai ngày đều rỗng hoặc trống?
Mã hóa thế giới

23

Truy vấn của bạn nên có ngày là

select * from table between `lowerdate` and `upperdate`

thử

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

20

date_fieldloạ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')

17

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

bạn có thể thêm một lời giải thích để mọi người sẽ hiểu bạn đang làm gì.
Franz Gleichmann

7

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

4

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

1

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.


3
Vấn đề là ngày cũ hơn được liệt kê trước ngày mới hơn.
theninjagreg

1

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

1

Khi sử dụng các giá trị Ngày Giờ, bạn phải bỏ các trường thành DateTimevà 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))

0

Hãy thử chuyển đổi ngày xung quanh:

2010-09-29 > 2010-01-30?
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.