Nếu tôi chạy một truy vấn với mệnh đề between
, nó dường như loại trừ giá trị kết thúc. Ví dụ:
For example:
select * from person where dob between '2011-01-01' and '2011-01-31'
Điều này nhận được tất cả các kết quả với dob
từ '2011-01-01' cho đến '2011-01-30'; Bỏ qua hồ sơ trong đó dob
là '2011-01-31'. Bất cứ ai cũng có thể giải thích lý do tại sao truy vấn này hoạt động theo cách này và làm thế nào tôi có thể sửa đổi nó để bao gồm các hồ sơ trong đó dob
là '2011-01-31'? [Không cần thêm 1 vào ngày kết thúc vì người dùng được chọn.]
Đã hỏi ngày 22 tháng 2 năm 2011 lúc 16:22Feb 22, 2011 at 16:22
1
Từ MySQL-Manual:
Điều này tương đương với biểu thức [tối thiểu
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 16:30Feb 22, 2011 at 16:30
Frank Heikensfrank HeikensFrank Heikens
Huy hiệu vàng 111K2424 gold badges136 silver badges132 bronze badges
5
Trường dob
có thể có thành phần thời gian.
Để cắt nó ra:
select * from person
where CAST[dob AS DATE] between '2011-01-01' and '2011-01-31'
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 16:40Feb 22, 2011 at 16:40
tiago2014tiago2014tiago2014
3,3721 Huy hiệu vàng20 Huy hiệu bạc28 Huy hiệu đồng1 gold badge20 silver badges28 bronze badges
8
Vấn đề là 2011-01-31 thực sự là 2011-01-31 00:00:00. Đó là sự khởi đầu của ngày. Tất cả mọi thứ trong ngày không được bao gồm.
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 16:35Feb 22, 2011 at 16:35
Daniel Hilgarthdaniel HilgarthDaniel Hilgarth
168K40 Huy hiệu vàng320 Huy hiệu bạc434 Huy hiệu đồng40 gold badges320 silver badges434 bronze badges
2
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 16:30Feb 22, 2011 at 16:30
Frank Heikensfrank HeikensGaurav
Huy hiệu vàng 111K248 gold badges48 silver badges78 bronze badges
6
Trường dob
có thể có thành phần thời gian.Date type or a DateTime type?
Để cắt nó ra:
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 16:40
3,3721 Huy hiệu vàng20 Huy hiệu bạc28 Huy hiệu đồng
Vấn đề là 2011-01-31 thực sự là 2011-01-31 00:00:00. Đó là sự khởi đầu của ngày. Tất cả mọi thứ trong ngày không được bao gồm.
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 16:35Feb 22, 2011 at 16:34
Daniel Hilgarthdaniel HilgarthJohnFx
168K40 Huy hiệu vàng320 Huy hiệu bạc434 Huy hiệu đồng18 gold badges104 silver badges161 bronze badges
Gauravgaurav
select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
Phù bằng vàng 28K848 Huy hiệu bạc78 Huy hiệu đồng
Trường bạn đang tham khảo trong truy vấn của bạn là loại ngày hoặc loại DateTime?19 gold badges116 silver badges150 bronze badges
Một nguyên nhân phổ biến của hành vi bạn mô tả là khi bạn sử dụng loại DateTime nơi bạn thực sự nên sử dụng loại ngày. Đó là, trừ khi bạn thực sự cần biết mấy giờ ai đó được sinh ra, chỉ cần sử dụng loại ngày.Dec 9, 2013 at 23:18
infinito84infinito84infinito84
Lý do ngày cuối cùng không được đưa vào kết quả của bạn là cách mà truy vấn giả định phần thời gian của ngày mà bạn không chỉ định trong truy vấn của mình.16 silver badges8 bronze badges
1
select * from person where DATE[dob] between '2011-01-01' and '2011-01-31'
Đó là: Truy vấn của bạn đang được hiểu là đến nửa đêm trong giai đoạn 2011-01-30 và 2011-01-31, nhưng dữ liệu có thể có giá trị vào cuối ngày vào ngày 2011-01-31.
Gợi ý: Thay đổi trường thành loại ngày nếu đó là loại DateTime.Aug 14, 2013 at 12:22
1
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 16:34
Johnfxjohnfx
34.4K18 Huy hiệu vàng104 Huy hiệu bạc161 Huy hiệu đồng
Xin chào truy vấn này hoạt động cho tôi,Oct 29, 2019 at 8:25
May mắnhaneulkim
16.3K19 Huy hiệu vàng116 Huy hiệu bạc150 Huy hiệu đồng7 gold badges30 silver badges62 bronze badges
Đã trả lời ngày 9 tháng 12 năm 2013 lúc 23:18
select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
1.81316 huy hiệu bạc8 Huy hiệu đồng
Đáng ngạc nhiên là các chuyển đổi như vậy là giải pháp cho nhiều vấn đề trong MySQL.
select * from person JOIN some_table ... where dob between some_table.initial_date and [some_table.final_date + INTERVAL 1 DAY - INTERVAL 1 SECOND]
Đã trả lời ngày 14 tháng 8 năm 2013 lúc 12:22
Do đó, trong MySQL giữa các giá trị bao gồm khi bạn cố gắng đạt được từ '2011-01-01' và '2011-01-31'Jan 4, 2019 at 17:37
Nó sẽ bao gồm từ
select * from person
where CAST[dob AS DATE] between '2011-01-01' and '2011-01-31'
3 cho đến select * from person
where CAST[dob AS DATE] between '2011-01-01' and '2011-01-31'
4 do đó không có gì thực sự trong 2011-01-31 vì thời gian của nó sẽ đi từ select * from person
where CAST[dob AS DATE] between '2011-01-01' and '2011-01-31'
5Đối với giới hạn trên, bạn có thể thay đổi thành
select * from person
where CAST[dob AS DATE] between '2011-01-01' and '2011-01-31'
6 thì nó sẽ nhận tất cả dữ liệu lên đến select * from person
where CAST[dob AS DATE] between '2011-01-01' and '2011-01-31'
7Feb 22, 2011 at 16:26
Đã trả lời ngày 29 tháng 10 năm 2019 lúc 8:25Rafal
Haneulkimhaneulkim2 gold badges17 silver badges13 bronze badges
1
select * from person where dob between '2011-01-01' and '2011-01-31' or dob like' 2011-01-31%'
4.0407 Huy hiệu vàng30 Huy hiệu bạc62 Huy hiệu Đồng
Bạn có thể chạy truy vấn như:Feb 20 at 16:28