MS SQL Server7 取出時間有交集的 SQL 句子 |
答題得分者是:timhuang
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
小弟有個 TableA, 欄位如下:
id int NOT NULL Primary Key dt1 datetime dt2 datetime現在有兩個時間點當條件式(假設一個是 dtStart, 一個是 dtStop), 只要資料庫欄位 dt1 - dt2 欄位組成的這段時間落在設的時間裡就算符合 小弟想了一下, 有四種符合的情況: 1.dt1 - dt2 完全落在兩個時間條件內 即 dt1 >= dtStart, dt2 <= dtStop 2.dtStart - dtStop 完全落在 dt1 - dt2 組成的時間內 即 dt1 <= dtStart, dt2 >= dtStop 3.dt1 >= dtStart, dt2 >= dtStop 4.dt1 <= dtStart, dt2 <= dtStop 在程式內用了四個 TDateTimePicker, 其中 DateTimePicker1 與 DateTimePicker3 用來設日期 DateTimePicker1 與 DateTimePicker3 用來設時間 於是用了如下的 SQL 語法: begin Query1.Close; Query1.CommandText := 'Select * From TableA Where (' '(dt1 <= :dt1 and dt2 >= :dt2) Or ' '(dt1 >= :dt1 and dt2 <= :dt2) Or ' '(dt1 <= :dt1 and dt2 <= :dt2) Or ' '(dt1 >= :dt1 and dt2 >= :dt2))'; Query1.Open; end;但 Select 出的結果不對 不知道小弟是什麼地方出錯了, 請大家指教! |
zshlf
一般會員 ![]() ![]() 發表:18 回覆:11 積分:5 註冊:2003-06-03 發送簡訊給我 |
|
zshlf
一般會員 ![]() ![]() 發表:18 回覆:11 積分:5 註冊:2003-06-03 發送簡訊給我 |
|
timhuang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
條件 3 和 4 有問題, 其實時間落點的判斷方式可以簡化, 僅需要判定兩種狀況即可, 弟以圖示說明, 如下圖, 一共有 4個 case, 分別為
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
感謝兩位大大的回覆
小弟比較清楚一點了
小弟依 timhuang 的說明, 做了如下的測試:
var dtStart, dtStop: TDatetime; begin Edit1.Text := '2004/06/30 08:00:00'; // Condition 1 Edit5.Text := '2004/12/24 20:00:00'; Edit2.Text := '2004/06/28 08:00:00'; // Condition 2 Edit6.Text := '2004/12/26 20:00:00'; Edit3.Text := '2004/06/30 08:00:00'; // Condition 3 Edit7.Text := '2004/12/26 20:00:00'; Edit4.Text := '2004/06/28 08:00:00'; // Condition 4 Edit8.Text := '2004/12/24 20:00:00'; if RadioButton1.Checked then begin dtStart := StrToDateTime(Edit1.Text); dtStop := StrToDateTime(Edit5.Text); end else if RadioButton2.Checked then begin dtStart := StrToDateTime(Edit2.Text); dtStop := StrToDateTime(Edit6.Text); end else if RadioButton3.Checked then begin dtStart := StrToDateTime(Edit3.Text); dtStop := StrToDateTime(Edit7.Text); end else if RadioButton4.Checked then begin dtStart := StrToDateTime(Edit4.Text); dtStop := StrToDateTime(Edit8.Text); end; ads1.Close; ads1.CommandText := 'Select * From TableA where ' '(:dtStart <= dt1 and dt1 <= :dtStop) or (dt1 <= :dtStart and :dtStart <= dt2)'; ads1.Parameters.ParamValues['dtStart'] := dtStart; ads1.Parameters.ParamValues['dtStop'] := dtStop; ads1.Open; end;小弟在 TableA 建立了一筆 record, 欄位值如下: id 欄位為 1 dt1 欄位為 2004/06/29 08:00:00 dt2 欄位為 2004/12/25 20:00:00 小弟做了 4 種情況的測試 發現只有在 Condtion 2 與 4 可以 Select 出該筆 record -- 棒球是從兩出局開始的. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |