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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

比較日期范圍

比較日期范圍

慕的地10843 2019-07-13 18:54:50
在MySQL中,如果我有一個(gè)日期范圍列表(范圍-開始和范圍-結(jié)束)。G.10/06/1983 to 14/06/198315/07/1983 to 16/07/198318/07/1983 to 18/07/1983我想檢查另一個(gè)日期范圍是否包含列表中的任何一個(gè)范圍,我將如何做到這一點(diǎn)?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貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

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

讓我舉個(gè)例子。

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

           |-------------------|          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

因此,如果簡(jiǎn)單地將比較簡(jiǎn)化為:

starts after end
ends before start

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

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

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

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

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

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

注意在里面。因?yàn)檫@兩個(gè)簡(jiǎn)單的規(guī)則可以找到所有的非匹配行,一個(gè)簡(jiǎn)單的不一定會(huì)倒過來說:如果它不是不匹配的行之一,則必須是匹配的行之一。.

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

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


查看完整回答
反對(duì) 回復(fù) 2019-07-13
?
絕地?zé)o雙

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊

以您的示例范圍為06/06/1983至18/06/1983,并假設(shè)您的列名為啟動(dòng)端部對(duì)于您的范圍,您可以使用這樣的子句

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

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


查看完整回答
反對(duì) 回復(fù) 2019-07-13
?
MM們

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊

我創(chuàng)建了函數(shù)來處理MySQL中的這個(gè)問題。只需將日期轉(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 ;


查看完整回答
反對(duì) 回復(fù) 2019-07-13
  • 3 回答
  • 0 關(guān)注
  • 635 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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