Giữa có bao gồm các điểm cuối mysql không?

Nếu expr lớn hơn hoặc bằng min và expr nhỏ hơn hoặc bằng max, BETWEEN trả về 1, ngược lại trả về 0. Điều này tương đương với biểu thức (min <= expr AND expr <= max) nếu tất cả các đối số cùng loại. Mặt khác, chuyển đổi loại diễn ra theo các quy tắc được mô tả tại Chuyển đổi loại, nhưng được áp dụng cho cả ba đối số

ví dụ

SELECT 1 BETWEEN 2 AND 3;
+-------------------+
| 1 BETWEEN 2 AND 3 |
+-------------------+
|                 0 |
+-------------------+
SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
SELECT 2 BETWEEN 2 AND '3';
+---------------------+
| 2 BETWEEN 2 AND '3' |
+---------------------+
|                   1 |
+---------------------+
SELECT 2 BETWEEN 2 AND 'x-3';
+-----------------------+
| 2 BETWEEN 2 AND 'x-3' |
+-----------------------+
|                     0 |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

Warning (Code 1292): Truncated incorrect DOUBLE value: 'x-3'

VÔ GIÁ TRỊ

SELECT 1 BETWEEN 1 AND NULL;
+----------------------+
| 1 BETWEEN 1 AND NULL |
+----------------------+
|                 NULL |
+----------------------+

Ví dụ về NGÀY, DATETIME và DẤU THỜI GIAN. Bỏ qua thành phần thời gian so sánh với 00:00, vì vậy thời gian sau đó trong cùng một ngày không được trả lại

CREATE TABLE `x` (
  a date ,
  b datetime,
  c timestamp
)

INSERT INTO x VALUES 
 ('2018-11-11', '2018-11-11 05:15', '2018-11-11 05:15'), 
 ('2018-11-12', '2018-11-12 05:15', '2018-11-12 05:15'); 

SELECT * FROM x WHERE a BETWEEN '2018-11-11' AND '2018-11-12';
+------------+---------------------+---------------------+
| a          | b                   | c                   |
+------------+---------------------+---------------------+
| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |
| 2018-11-12 | 2018-11-12 05:15:00 | 2018-11-12 05:15:00 |
+------------+---------------------+---------------------+

SELECT * FROM x WHERE b BETWEEN '2018-11-11' AND '2018-11-12';
+------------+---------------------+---------------------+
| a          | b                   | c                   |
+------------+---------------------+---------------------+
| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |
+------------+---------------------+---------------------+

SELECT * FROM x WHERE c BETWEEN '2018-11-11' AND '2018-11-12';
+------------+---------------------+---------------------+
| a          | b                   | c                   |
+------------+---------------------+---------------------+
| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |
+------------+---------------------+---------------------+

Bình luận

Nội dung được sao chép trên trang web này là tài sản của chủ sở hữu tương ứng và nội dung này không được MariaDB xem xét trước. Quan điểm, thông tin và ý kiến ​​được thể hiện bởi nội dung này không nhất thiết đại diện cho quan điểm của MariaDB hoặc bất kỳ bên nào khác

Không có gì đánh bại kinh nghiệm thực tế trong lập trình. Trên thực tế, hầu hết mọi thứ trong cuộc sống đều được học hỏi thông qua kinh nghiệm

Gần đây, tôi đang triển khai một tính năng trong ứng dụng web ngăn xếp LAMP và gặp khó khăn khi lọc truy vấn MySQL theo các giá trị cột DATETIME bằng cách sử dụng toán tử BETWEEN

Hình ảnh được cung cấp bởi OpenClipart-Vectors từ Pixabay

Tôi có ấn tượng rằng BETWEEN đã bao gồm, nghĩa là bất kỳ giá trị nào trong phạm vi được chỉ định, cùng với những giá trị phù hợp với cả phạm vi cấp cao và cấp thấp, cũng sẽ được bao gồm trong tập kết quả được trả về

BETWEEN đã bao gồm. Tuy nhiên, như tôi đã phát hiện ra, kiểu dữ liệu cột DATETIME hoạt động hơi bất ngờ, khi là một phần của truy vấn phạm vi BETWEEN. Hoặc ít nhất đó là kinh nghiệm của tôi trong trường hợp này. Vì truy vấn của tôi không trả về đúng số lượng hàng dự kiến ​​nên điều đó đã thôi thúc tôi điều tra thêm và thử tìm hiểu lý do tại sao

Rốt cuộc, kết quả truy vấn không chính xác chỉ có vậy;

Ứng dụng web tôi đang làm sử dụng MariaDB 10. 2. 38. Tuy nhiên, tôi đang sử dụng MySQL Phiên bản 8. 0. 25 cho dữ liệu và ví dụ trong bài đăng này

Thiết lập dữ liệu giả

Tôi sẽ tạo một bảng đơn giản cho mục đích demo, có 3 cột

Mặc dù tôi không nhất thiết cần phần thành phần Thời gian của kiểu dữ liệu DATETIME, nhưng cái hay của việc sử dụng nó trong định nghĩa cột là khả năng đặt các hàng

SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
4 thành
SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
5 và
SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
6 bằng cách sử dụng từ khóa
SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
4 khi bạn muốn cột DateTime hiện tại

Đối với những trường hợp mà bạn cần lưu trữ một ngày cụ thể, bạn cũng có thể dễ dàng

SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
6 những ngày đó, bỏ qua phần Thời gian

Tất cả các truy vấn sau đây đều được thực hiện tại thời điểm hiện tại của bài viết này, ngày 2 tháng 6 năm 2021, như được hiển thị với hàm

SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
5

Dữ liệu có trong bảng 'practice_names' được hiển thị bên dưới

mysql-workbench-query-results-with-select

Tất cả dữ liệu từ bảng practice_names

Lọc hàng theo ngày sử dụng BETWEEN

Nếu tôi muốn tất cả các hàng được trả về giữa — và bao gồm cả — ngày '2021–05–31' và '2021–06–02', truy vấn này sẽ thực hiện

mysql-workbench-query-results-with-between

Kết quả truy vấn không có số hàng chính xác

Đợi tí

Những kết quả truy vấn đó không chính xác

2 hàng có giá trị Ngày là '2021–06–02' cũng phải được đưa vào tập kết quả trả về

Đưa cái gì?

Type-casting sử dụng chức năng CAST()

Sau nhiều lần vò đầu bứt tai và tra Google để khởi động, tôi phát hiện ra rằng cột 'inclusion_date' có thể được chuyển kiểu thành kiểu dữ liệu BETWEEN3 (nhớ lại, cột được tạo dưới dạng kiểu dữ liệu DATETIME) để truy vấn trả về đúng số

Sử dụng hàm BETWEEN5 trong mệnh đề BETWEEN6 như được hiển thị trong truy vấn đã sửa đổi bên dưới sẽ trả về đúng số hàng

mysql-workbench-query-results-with-between-and-cast-function

Kết quả truy vấn với các hàng chính xác được trả về

Tại sao truy vấn này hoạt động khi chuyển kiểu từ cột ________ 7 sang cột ________ 83 bằng cách sử dụng ________ 85?

Hãy xem liệu chúng ta có thể trả lời câu hỏi đó bằng các truy vấn tiếp theo bổ sung hay không…

Tôi có thể đảm bảo với bạn một điều. Nếu bạn mua cho tôi một ly cà phê, tôi sẽ uống nó

Bao gồm cả phần Thời gian trong GIỮA Truy vấn

Dựa trên dữ liệu có trong bảng 'practice_names', các hàng có giá trị BETWEEN0 1 và 2 có phần Thời gian là BETWEEN1. Nhắc lại, 2 hàng đó được chèn giá trị cột

SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
4 (
SELECT 'b' BETWEEN 'a' AND 'c';
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
|                       1 |
+-------------------------+
5)

Tôi sẽ thực hiện một truy vấn mà không sử dụng BETWEEN5 và thêm phần Thời gian vào giá trị cấp trên

Bao gồm một phần thời gian trong truy vấn…

Không có thay đổi ở đó

Bây giờ, làm thế nào về việc bao gồm một phần Thời gian cho đến tận nửa đêm?

Bao gồm một phần thời gian cho đến gần nửa đêm…

Số hàng chính xác được trả về trong truy vấn này

Tôi cảm thấy rằng bằng cách bao gồm giá trị phần Thời gian của BETWEEN5, các hàng có 1 và 2 của BETWEEN0 được trả về vì phần Thời gian của chúng là BETWEEN1 nằm giữa phạm vi trên và dưới được chỉ định của BETWEEN

Bao gồm một giá trị Phần thời gian có thể không phải là một giải pháp thực tế vì bạn sẽ cần có kiến ​​thức trực tiếp về các giá trị Phần thời gian cho mỗi cột DATETIME trừ khi các thành phần Thời gian là không thể thiếu đối với các yêu cầu kinh doanh cụ thể của bạn. Trong trường hợp của tôi, các phần Thời gian ít quan trọng hơn (hoặc tôi nghĩ vậy. )

Tài nguyên thông tin bổ sung

  • Truy cập tài liệu MySQL trực tuyến về các loại dữ liệu DATE, DATETIME và TIMESTAMP để biết thêm thông tin. (liên kết ngoại vi)
  • (liên kết ngoại vi)
  • (liên kết ngoại vi)

Tôi hy vọng rằng nếu bạn đang phải đối mặt với cùng một loại mâu thuẫn trong các truy vấn cột BETWEEN3 hoặc DATETIME bằng cách sử dụng BETWEEN, thì bạn có thể khắc phục chúng dễ dàng hơn khi bạn đã đọc bài đăng này và hiểu một cách để giải quyết loại truy vấn này

Đọc thêm

Hãy chắc chắn và truy cập bất kỳ bài đăng blog nào dưới đây để biết nội dung tương tự

  • Biểu thức CASE đã tìm kiếm của MySQL — với các ví dụ
  • Số lần xuất hiện trong tuần của MySQL
  • Truy vấn tổng hợp MySQL bằng Trình tạo truy vấn của CodeIgniter (liên kết ngoại vi)

Giống như nội dung, bạn đã đọc trong bài viết này?

Ở đó, bạn sẽ tìm thấy các bài đăng trên blog về phát triển/lập trình cơ sở dữ liệu SQL và phát triển web ngăn xếp LAMP

Gần đây, tôi đã bắt đầu gửi email hàng tuần để chia sẻ về mọi thứ mà tôi quan tâm, tôi đang tìm hiểu hoặc tôi đã viết về SQL/PHP. Nếu đó là điều bạn quan tâm, hãy đăng ký tại đây

Giữa có bao gồm các điểm cuối trong truy vấn SQL không?

Toán tử BETWEEN chọn các giá trị trong một phạm vi nhất định. Các giá trị có thể là số, văn bản hoặc ngày tháng. Toán tử BETWEEN đã bao hàm. giá trị bắt đầu và kết thúc được bao gồm

Là giữa trong MySQL bao gồm?

Toán tử BETWEEN của MySQL bao gồm . Ví dụ: khi bạn sử dụng toán tử BETWEEN của MySQL để truy xuất những cuốn sách có giá nằm trong khoảng từ 50 đến 90, kết quả sẽ truy xuất tất cả những cuốn sách này, bao gồm cả những cuốn sách có giá bằng 50 hoặc 90.

Chúng ta có thể sử dụng giữa trong MySQL không?

Toán tử BETWEEN trong MySQL, hay viết tắt là "GIỮA", là toán tử logic được sử dụng để chọn một dải giá trị từ bảng cơ sở dữ liệu . Sử dụng BETWEEN, chúng ta cũng có thể kiểm tra xem một giá trị có nằm trong phạm vi được cung cấp hay không. Truy vấn giữa trong MySQL thường được sử dụng với câu lệnh SELECT.

Việc sử dụng trong và giữa các truy vấn MySQL là gì?

Điều kiện BETWEEN của SQL cho phép bạn dễ dàng kiểm tra xem một biểu thức có nằm trong một dải giá trị (bao gồm) hay không . Các giá trị có thể là văn bản, ngày hoặc số. Nó có thể được sử dụng trong câu lệnh SELECT, INSERT, UPDATE hoặc DELETE.