Chọn dữ liệu giữa một phạm vi ngày / giờ


83

Làm cách nào để chọn dữ liệu giữa một phạm vi ngày trong MySQL. datetimeCột của tôi ở định dạng giờ zulu 24 giờ.

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

Không trả về mặc dù có dữ liệu giữa các khoảng thời gian này. Tôi có phải buộc các giá trị trong 'từ''thành' trường để datetimegõ truy vấn?


Kiểu dữ liệu dùng để làm game_dategì?
hjpotter92

1
ngày giờ của nó. Tôi nghĩ rằng tôi đã tìm ra lý do tại sao tôi bối rối. Tôi đang sử dụng phần mềm cóc cho mysql và theo mặc định, nó hiển thị ngày ở định dạng tôi đã sử dụng trong phạm vi ngày của mình, đó là lý do tại sao tôi sử dụng như vậy. Vì vậy, vấn đề là định dạng của ngày tôi đã cung cấp trong phạm vi của mình.
codingknob

Nếu tôi sử dụng định dạng do Eugen Rieck cung cấp, nó hoạt động như mong đợi.
codingknob

Câu trả lời:


143

Bạn cần cập nhật định dạng ngày:

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;

2
cái nào là ngày và cái nào là tháng ở đây?
Arun

8
Định dạng cho chữ ngày là 'YYYY-MM-DD HH: mm: SS'
Eugen Rieck

13
Sử dụng BETWEEN KHÔNG phải là phương pháp hay nhất, đặc biệt vì MySQL hiện hỗ trợ độ chính xác thời gian phụ thứ hai . Sử dụng 23:59:59 chỉ còn một giây ngắn ngủi để kết thúc một ngày. where game_date >= '2012-03-11' and game_date < '2012-05-12'là cách chính xác nhất để xác định phạm vi ngày và sẽ hoạt động ở bất kỳ mức độ chính xác thời gian nào từ ngày đến đơn vị thứ hai.
Đã sử dụng_By_Already

3
@Used_By_Already Khi điều này được trả lời vào năm 2013, không có MySQL phụ thứ hai - tôi vẫn chưa nghe nói về một trận đấu khúc côn cầu bắt đầu từ 23:59 đến 00:00 với thời gian bắt đầu dưới giây.
Eugen Rieck

5
Tôi đã để lại nhận xét này cho những người đọc sử dụng các phiên bản MySQL với độ chính xác dưới giây. MySQL phiên bản 5.6.4 trở lên hỗ trợ giây phân số. (Liên quan đến môn thể thao hoặc mục đích mà phạm vi ngày dành cho.)
Đã sử dụng_By_Already

19

Đây là một cách đơn giản bằng cách sử dụng hàm ngày:

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc

7
Tôi bị mù hay đây là một kẻ giết người về hiệu suất? date(game_date)sẽ chạy so sánh dựa trên một giá trị được calulcated , không phải một trường - dẫn đến không sử dụng chỉ mục và mọi hàng đơn lẻ đều được chạm vào (tức là quét toàn bộ bảng)!
Eugen Rieck

1
@EugenRieck. . . Nói chung, bạn đúng, giả sử rằng có một chỉ mục trên game_date. Ngay cả khi không có chỉ mục, bảng sẽ phải có kích thước vừa phải để có sự khác biệt đáng chú ý về hiệu suất. Một cái gì đó về tên hockey_statsgợi ý cho tôi rằng đây không phải là một chiếc bàn thực sự lớn.
Gordon Linoff

8

Một cách đơn giản:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'

5

Bạn có thể cần sử dụng hàm STR_TO_DATE :

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(nếu game_date là một chuỗi, bạn có thể cần sử dụng STR_TO_DATE trên đó)


4

Định dạng ngày MySQL là: YMD. Bạn đang sử dụng Y / M / D. Đó là sai lầm. sửa đổi truy vấn của bạn.

Nếu bạn chèn ngày như Y / M / D, Nó sẽ chèn giá trị null vào cơ sở dữ liệu.

Nếu bạn đang sử dụng PHP và ngày bạn nhận được từ biểu mẫu này là Y / M / D, bạn có thể thay thế điều này bằng cách sử dụng câu lệnh.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))

4

Theo một cách đơn giản, nó có thể được truy vấn là

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

Điều này hoạt động nếu thời gian không phải là mối quan tâm.

Xem xét thời gian cũng theo cách sau:

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

Lưu ý điều này dành cho máy chủ MySQL.


2

Bạn có thể sử dụng hàm STR_TO_DATE và chuyển các thông số ngày tháng của riêng bạn dựa trên định dạng bạn đã đăng:

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

Hoặc chỉ sử dụng định dạng mà MySQL xử lý ngày YYYY: MM: DD HH: mm: SS và có truy vấn là

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;


2

Bạn phải tìm kiếm bảo vệ ngày về cách bạn chèn dữ liệu game_date đó vào cơ sở dữ liệu của mình .. ví dụ: nếu bạn chèn giá trị ngày vào ngày dài hoặc ngày ngắn.

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

Bạn cũng có thể sử dụng GIỮA :

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

đơn giản như thế.


Tôi đang cố gắng như vậy, nhưng nó không hoạt động bình thường, nhận được dữ liệu ngày khôn ngoan ngẫu nhiên.
Manjeet Kumar Nai
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.