iT邦幫忙

0

SQL 多個值 的 BETWEEN

舉例
T1表
DATE
20210723
20210725
20210728

T2表
MAC| DS| DE
A| 20210601| 20210620
B| 20210701| 20210730
C| 20210720| 20210730
D| 20210801| 20210815
E| 20210601| 20210820

要找出T2中,DS~DE區間中,符合T1指定日期的所有資料
類似↓(這是錯的,只是表達意思)
SELECT * FROM T2
WHERE (SELECT DATE FROM T1) BETWEEN T2.DS AND T2.DE
這種感覺
結果要顯示 B,C,E這三筆(這三筆的區間日期都有T1的日期)

請問SQL 要怎樣修正?

大大好,請問如果 來源不是一個表,而也是一個傳入值的區間呢?
SELECT * FROM T2
WHERE ( ? ~ ? ) BETWEEN T2.DS AND T2.DE
如果沒輸入起訖,就表示全部查詢

2 個回答

0
微笑
iT邦新手 3 級 ‧ 2021-07-23 17:38:19
最佳解答
DECLARE @TABLE_A AS TABLE
(
	[DATE] DATE
)

DECLARE @TABLE_B AS TABLE
(
	[MAC] NVARCHAR(2),
	[DS] DATE,
	[DE] DATE
)

INSERT INTO @TABLE_A VALUES
('20210723'),
('20210725'),
('20210728')

INSERT INTO @TABLE_B VALUES
('A','20210601','20210620'),
('B','20210701','20210730'),
('C','20210720','20210730'),
('D','20210801','20210815'),
('E','20210601','20210820')

SELECT DISTINCT MAC,DS,DE FROM @TABLE_B
INNER JOIN @TABLE_A ON [DATE] BETWEEN DS AND DE

結果如下
1

看更多先前的回應...收起先前的回應...
jhit03 iT邦新手 4 級 ‧ 2021-07-24 16:05:19 檢舉

大大,你好,請問如果 來源不是一個表,而也是一個傳入值的區間呢?
SELECT * FROM T2
WHERE ( ? ~ ? ) BETWEEN T2.DS AND T2.DE
如果沒輸入起訖,就表示全部查詢

微笑 iT邦新手 3 級 ‧ 2021-07-24 19:43:46 檢舉

傳入值直接丟yyyymmdd就好

SELECT * FROM T2
WHERE '20210701' BETWEEN T2.DS AND T2.DE

起訖是你的DS跟DE才對
沒輸入的話這邊就不用下where語句

jhit03 iT邦新手 4 級 ‧ 2021-07-26 08:14:13 檢舉

我的意思類似
SELECT * FROM T2
WHERE ('20210701'~'20210820') BETWEEN T2.DS AND T2.DE
指定一個區間的比對

然後會顯示B,C,D,E 共4筆資料

微笑 iT邦新手 3 級 ‧ 2021-07-26 10:38:14 檢舉
SELECT * FROM T2
where (DS between '20210701' and '20210820'
or DE between '20210701' and '20210820')
and DE >= DS
微笑 iT邦新手 3 級 ‧ 2021-07-26 10:42:16 檢舉

between的準則永遠是一對範圍的查詢
這邊的重點在 or
and的結果會是交集
or的結果會是聯集

了解概念後,答案就呼之欲出了。

jhit03 iT邦新手 4 級 ‧ 2021-07-27 13:04:35 檢舉

謝謝

1
純真的人
iT邦大師 1 級 ‧ 2021-07-23 17:31:06

參考@@

select a.*
from T2 a
,T1 b
where b.DATE between a.DS and DE
jhit03 iT邦新手 4 級 ‧ 2021-07-23 17:45:48 檢舉

謝謝,你跟微笑大大的應該同個方法,但我後來比對資料,因為差一個DISTINCT。所以有多幾筆重複的,所以把最佳給微笑大大,但一樣謝謝你

我要發表回答

立即登入回答