2018年2月28日 星期三

查詢期間內休假人員(區間查詢)-應用狄摩根定理(DeMorgan’s Theorem)

欲查詢2013-09-162013-09-18此段時間之休假(公出)人員,符合條件者如下表中A01A03A043人,由於符合查詢條件組合繁多,難以撰寫符合各種狀況的查詢條件,尤其以A01已超越查詢區間,此類問題應嘗試以反向思考模式,以數位邏輯設計中之狄摩根定理(DeMorgan’s Theorem)進行簡化,可歸納出非常簡單之結論,推論說明如下

以下列出狄摩根定理(DeMorgan’s Theorem),以供參閱並自行推論。
狄摩根定理(DeMorgan’s Theorem
因符合條件之組合繁多(如下圖中X區域),難以全面考量各種可能狀況,因此應以反向思考,首先列出不符合查詢條件之組合( ,包含 再排除不符合條件者,負負得正,即 

並將執行步驟整理如下:
步驟
圖示
條件式
1.不符合
查詢條件
DayOff.EDate < Query.SDate     --u
  OR DayOff.SDate > Query.EDate --v
(即: 
2.排除
不符合
DayOff.EDate >= Query.SDate     --u
  AND DayOff.SDate <= Query.EDate --v
(即: ……公式3

Step 01不符合查詢條件之組合(
不符合查詢條件包含兩個區域,大於查詢上界時間(UBoundEDate)及小於查詢下界時間(LBoundSDate)SQL及查詢結果,如下。請注意,查詢應包含上界(結束)當天日期,因此查詢條件應採用次日日期而非當日。
SQL
執行結果
SELECT Emp_No
       , CONVERT(CHAR(16), SDate, 120) SDate
       , CONVERT(CHAR(16), EDate, 120) SDate
FROM #DayOff O
WHERE 1=0
OR O.EDate < '2013-09-16'              --(1)
OR O.SDate > DATEADD(dd,1,'2013-09-18')--(2)


Step 02:排除不符合條件者(負負為正,
排除符合前一步驟中之資料,依狄摩根定理將SQL改寫,如下。查詢上界(結束)應採用次日日期,但包含次日該時點,因此公式應修正為小於(<)。
SQL
執行結果
SELECT Emp_No
       , CONVERT(CHAR(16), SDate, 120) SDate
       , CONVERT(CHAR(16), EDate, 120) SDate
FROM #DayOff O
WHERE 1=1
AND O.EDate >= '2013-09-16'             --(1)
AND O.SDate < DATEADD(dd,1,'2013-09-18')--(2)
注意:式(2)為開放式查詢條件,將以FULL TABLE SCAN方式而造成效能問題,可額外增加90天內篩選條件(產假56天)。

由前述運算式中,可歸納出區間查詢基本思考是為任一上限值(U.Bound)必大於另一下限值(L.Bound

最後,以常用(正向)思考模式難以處理區間查詢此類難題,可嘗試以反向思維解決,或者利用數學、數位邏輯(如:卡諾圖)或演算法等概念進行歸維簡化,相信應可找到另類且有效的方法。

資料產生SQL
SELECT * INTO #DayOff
FROM (VALUES ('A01'
              , DATEADD(dd, 0, '2013-09-14 09:00')
                          , DATEADD(dd, 0, '2013-09-23 18:00')    )
           , ('A03', '2013-09-18 09:00', '2013-09-18 18:00')
           , ('A04', '2013-09-18 13:00', '2013-09-23 18:00')
           , ('A07', '2013-09-14 09:00', '2013-09-14 18:00')
           , ('A08', '2013-09-23 09:00', '2013-09-23 18:00')
           , ('A10', '2013-09-13 09:00', '2013-09-13 18:00')
        ) DayOff(Emp_No, SDate, EDate)




2018年2月26日 星期一

常用資料庫SQL語法免費測試網站(SQL Fiddle)

如欲學習/測試許多種SQL語法,但軟硬資源有限,難取得各種資料庫軟體以及建置測試環境,而SQL Fiddle網站目前免費提供多種常用資料庫資源,可解決技術評估/測試之環境建立之難題,此網站服務也提供資料分享功能,在問題咨詢或教學上非常實用,值得推薦使用。優點如下:
1.   環境多樣性:支援常用ORACLEMSSQLMySQL資料庫及較新版本。
2.   連線便利性:透過網頁即可連線,不管PC或行動裝置(智慧型行動電話)均可。
3.   共享容易性:提供具有連線Session Id之連線網址,即可與他人共用或取得咨詢。

網站資訊及簡單操作介紹,如下:

[網站資訊]

[支援資料庫及版本]
Database
Verison
ORACLE
11g R2
SQL Server
2017
MySQL
5.6
PostgreSQL
9.6
PostgreSQL
9.3
SQLite
WebSQL
SQLite
SQL.js

[使用介面]
操作介面主要可分成DDLDMLResult三個區域,
1.   DDL區域(左側)
主要用於物件建立(:CREATE TABLE)及資料新增(INSERT)等操作。如欲直接使用網站範例資料時,可按下[View Sample Fiddle]按鍵即可載入範例資料指令。
2.   DML區域(右側)
SELECT指令語法區域。
3.   Result(下方)
用於呈現執行結果。

[操作簡介]
1.   選擇資料庫版本
選擇欲使用之資料庫版本。
2.   Build Schema必要步驟及存在
將資料建立相關指令撰寫於DDL區域,按下[Build Schema]且已通過檢核,則網站將產生連線Session Id 附加於網址後方(如: http://sqlfiddle.com/#!9/2438f),可將此連結網址提供給他人,透過網頁即可分享內容(包含DML指令)或參考咨詢,相當方便。但當DDL內容任何變更時,則必需重新執行及驗證。

3.   Run SQL


以先前九九乘法表》文章為例:
九九乘法表案例中,不管ORACLEMSSQL語法,雖均僅使用系統資料表而已,但仍必需有Schema,否則無法通過系統檢核而無法使用