iT邦幫忙

2

不包含重複日期區間的邏輯問題

  • 分享至 

  • twitterImage

最近做了一個CRUD,每筆資料都會有開始時間及結束時間,請問一下要如何判斷使用者輸入的資料開始日期及結束日期,不能涵蓋到已經輸入的每筆資料的日期範圍?
例如:
已有資料
1.2020-5-14~2020-6-19
2.2020-7-14~2020-8-20
那輸入時就不能輸入2020-6-20~2020-7-15

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-08-05 15:37:17
最佳解答
WHERE (輸入開始時間 >= db開始時間 AND 輸入開始時間 <= db結束時間) OR (輸入結束時間 >= db開始時間 AND 輸入結束時間 <= db結束時間)

依上面的條件做。只要有拿到資料就不能。
忘了大包小的情況,修正如下

WHERE (輸入開始時間 >= db開始時間 AND 輸入開始時間 <= db結束時間) OR (輸入結束時間 >= db開始時間 AND 輸入結束時間 <= db結束時間) OR (db開始時間 >= 輸入開始時間 AND db開始時間 <= 輸入結束時間)
看更多先前的回應...收起先前的回應...
ckp6250 iT邦好手 1 級 ‧ 2020-08-05 15:48:18 檢舉

這種避開區間的用途挺廣的,請假或排班系統必定用到,我的習慣會寫在觸發程序中。

暗!!!我又打錯字了。剛剛正在寫DO的程式。直接打成WHILE了。

淺水員 iT邦大師 6 級 ‧ 2020-08-05 15:56:31 檢舉

少了大區間包小區間的狀況

對喔,我忘了還有大包小的情況@@"
我的條件碰上大包小就過了。改一下

淺水員 iT邦大師 6 級 ‧ 2020-08-05 16:26:53 檢舉

其實大包小共有兩種,一種是「輸入包DB」,另一種是「DB包輸入」。

DB包輸入在第一或二的條件就成立了。所以沒差。
我原本的條件是輸入包DB會判斷不到。

淺水員 iT邦大師 6 級 ‧ 2020-08-05 16:44:57 檢舉

了解,剛剛沒注意到。

1
japhenchen
iT邦超人 1 級 ‧ 2020-08-05 15:52:50
declare @dt = '2020/08/05'
if exists (
	select * from table where date = @dt
)
    print '已存在'
else
	insert into table ...
1
淺水員
iT邦大師 6 級 ‧ 2020-08-05 16:25:59

如果在保證開始時間小於結束時間的情況下
允許的狀況其實只有 t1_s < t1_e < t2_s < t2_et2_s < t2_e < t1_s < t1_e
所以判斷是否交集可以用

WHERE NOT ( db時間結束 < 輸入時間開始 OR 輸入時間結束 < db時間開始)

經過邏輯處理,等同於

WHERE db時間結束 >= 輸入時間開始 AND 輸入時間結束 >= db時間開始

日期可以用BETWEEN 啦

DECLARE @DATEA DATETIME
SET @DATEA = '2015/8/5'
DECLARE @DATEB DATETIME
SET @DATEB = '2020/8/10'

SELECT * FROM 課程資料 WHERE 起始日 BETWEEN @DATEA AND @DATEB

淺水員 iT邦大師 6 級 ‧ 2020-08-06 11:41:24 檢舉

也許是我習慣把大於跟小於符號統一一個方向
所以看起來好像可以用 BETWEEN
但是實際上是四個變數在比較
而不是某變數是夾在另外兩個變數中間的狀況

我要發表回答

立即登入回答