2009-11-09 61 views
14

Tôi cần trợ giúp về truy vấn SQL.Truy vấn SQL KHÔNG phải giữa hai ngày

Tôi đang cố gắng chọn tất cả các bản ghi từ bảng test_table sẽ không khớp giữa hai ngày '2009-12-15' và '2010-01-02'.

Đây là cấu trúc bảng của tôi:

`start_date` date NOT NULL default '0000-00-00', 
`end_date` date NOT NULL default '0000-00-00' 

----------------------------- 
**The following record should not be selected:** 

`start_date`, `end_date` 
'2003-06-04', '2010-01-01' 

truy vấn của tôi:

SELECT * 

FROM `test_table` 
WHERE 

CAST('2009-12-15' AS DATE) NOT BETWEEN start_date and end_date 
AND 
CAST('2010-01-02' AS DATE) NOT BETWEEN start_date and end_date 

Bất cứ ý tưởng tại sao truy vấn của tôi chọn hồ sơ sai? Tôi có nên thay đổi thứ tự của các giá trị trong truy vấn đến một cái gì đó như:

start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE) 

Cảm ơn rất nhiều sự giúp đỡ nào

+0

Nếu bạn đặt NOT trước ngày bắt đầu, nó sẽ hoạt động. – brandonstrong

Trả lời

25

sao bạn không thử:

select * from 'test_table' 
where end_date < CAST('2009-12-15' AS DATE) 
or start_date > CAST('2010-01-02' AS DATE) 

mà sẽ trả lại tất cả các phạm vi ngày mà không chồng chéo phạm vi ngày của bạn cả.

+2

Tôi sẽ tư vấn chống lại điều này, trên các bảng trung bình, điều này sẽ khiến cho truy vấn trở nên rất chậm. – Xnoise

+3

@xnoise - và những gì, hãy nói, là lựa chọn thay thế của bạn? – MatBailie

+2

Bạn có thể giải thích tại sao "KHÔNG GIỮA" không hoạt động ở đây không? –

2

Bạn có nghĩa là phạm vi ngày các hàng đã chọn không nên nằm hoàn toàn trong phạm vi ngày cụ thể ? Trong trường hợp này:

select * 
from test_table 
where start_date < date '2009-12-15' 
or end_date > date '2010-01-02'; 

(Cú pháp trên dành cho Oracle, bạn có thể hơi khác).

0

Giả sử start_date đó là trước khi end_date,

khoảng [start_date..end_date] KHÔNG GIỮA hai ngày chỉ đơn giản có nghĩa là một trong hai nó bắt đầu trước khi 2009/12/15 hoặc nó kết thúc sau 2010/01/02.

Sau đó, bạn chỉ có thể làm

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE) 
1

gì bạn đang làm là kiểm tra xem không phải các start_date hay sự sụp đổ end_date trong phạm vi của những ngày nhất định.

Tôi đoán những gì bạn đang thực sự tìm kiếm là bản ghi không phù hợp với trong phạm vi ngày được cung cấp. Nếu có, hãy sử dụng truy vấn bên dưới.

SELECT * 
    FROM `test_table` 
    WHERE CAST('2009-12-15' AS DATE) > start_date AND CAST('2010-01-02' AS DATE) < end_date 
5

Logic của bạn bị ngược.

SELECT 
    * 
FROM 
    `test_table` 
WHERE 
     start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE) 
    AND end_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE) 
0

Để có sự trùng lặp, ngày bắt đầu của bảng phải là LESS THAN ngày kết thúc khoảng thời gian (nghĩa là phải bắt đầu trước khi kết thúc khoảng thời gian) VÀ THỜI GIAN của bảng phải là GREATER THAN ngày bắt đầu khoảng thời gian. Bạn có thể cần phải sử dụng < = và > = tùy thuộc vào yêu cầu của bạn.

1

Nếu 'NOT' được đặt trước ngày bắt đầu thì nó sẽ hoạt động. Vì một lý do nào đó (tôi không biết tại sao) khi 'NOT' được đặt trước khi 'GIỮA' có vẻ như nó đã trả lại mọi thứ.

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE)) 
Các vấn đề liên quan