第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較日期范圍

比較日期范圍

慕的地10843 2019-07-13 18:54:50
在MySQL中,如果我有一個日期范圍列表(范圍-開始和范圍-結(jié)束)。G.10/06/1983 to 14/06/198315/07/1983 to 16/07/198318/07/1983 to 18/07/1983我想檢查另一個日期范圍是否包含列表中的任何一個范圍,我將如何做到這一點?G.06/06/1983 to 18/06/1983 = IN LIST10/06/1983 to 11/06/1983 = IN LIST14/07/1983 to 14/07/1983 = NOT IN LIST
查看完整描述

3 回答

?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

這是一個經(jīng)典的問題,如果你逆轉(zhuǎn)邏輯,它實際上會更容易。

讓我舉個例子。

我將在這里張貼一段時間,以及所有其他時期的不同變化,以某種方式重疊。

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start+end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period

另一方面,讓我發(fā)布所有不重疊的內(nèi)容:

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after

因此,如果簡單地將比較簡化為:

starts after end
ends before start

然后你會找到所有不重疊的,然后你會找到所有不匹配的周期。

對于最后一個不是在列表中的例子,您可以看到它與這兩個規(guī)則相匹配。

您需要確定下列期間是否在您的范圍內(nèi)或范圍之外:

           |-------------|
   |-------|                       equal end with start of comparison period
                         |-----|   equal start with end of comparison period

如果表中有名為range_end和range_start的列,下面提供一些簡單的SQL來檢索所有匹配的行:

SELECT *FROM periodsWHERE NOT (range_start > @check_period_end           OR range_end < @check_period_start)

注意在里面。因為這兩個簡單的規(guī)則可以找到所有的非匹配行,一個簡單的不一定會倒過來說:如果它不是不匹配的行之一,則必須是匹配的行之一。.

在這里應用簡單的反轉(zhuǎn)邏輯來消除NOT,您將得到以下結(jié)果:

SELECT *FROM periodsWHERE range_start <= @check_period_end      AND range_end >= @check_period_start


查看完整回答
反對 回復 2019-07-13
?
絕地無雙

TA貢獻1946條經(jīng)驗 獲得超4個贊

以您的示例范圍為06/06/1983至18/06/1983,并假設您的列名為啟動端部對于您的范圍,您可以使用這樣的子句

where ('1983-06-06' <= end) and ('1983-06-18' >= start)

例如,檢查測試范圍的開始在數(shù)據(jù)庫范圍結(jié)束之前,測試范圍的結(jié)束在數(shù)據(jù)庫范圍開始后或開始時。


查看完整回答
反對 回復 2019-07-13
?
MM們

TA貢獻1886條經(jīng)驗 獲得超2個贊

我創(chuàng)建了函數(shù)來處理MySQL中的這個問題。只需將日期轉(zhuǎn)換為使用前的秒。

DELIMITER ;;CREATE FUNCTION overlap_interval(x INT,y INT,a INT,b INT)RETURNS INTEGER DETERMINISTICBEGINDECLARE
    overlap_amount INTEGER;
    IF (((x <= a) AND (a < y)) OR ((x < b) AND (b <= y)) OR (a < x AND y < b)) THEN
        IF (x < a) THEN
            IF (y < b) THEN
                SET overlap_amount = y - a;
            ELSE
                SET overlap_amount = b - a;
            END IF;
        ELSE
            IF (y < b) THEN
                SET overlap_amount = y - x;
            ELSE
                SET overlap_amount = b - x;
            END IF;
        END IF;
    ELSE
        SET overlap_amount = 0;
    END IF;
    RETURN overlap_amount;END ;;DELIMITER ;


查看完整回答
反對 回復 2019-07-13
  • 3 回答
  • 0 關(guān)注
  • 627 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號