線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2326
推到 Plurk!
推到 Facebook!

MS SQL Server7 取出時間有交集的 SQL 句子

答題得分者是:timhuang
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-17 08:41:16 IP:202.39.xxx.xxx 未訂閱
小弟有個 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-17 09:05:58 IP:61.142.xxx.xxx 未訂閱
这样的条件不是把所有的情况都包含了吗? 产生的结果应当和没有where子句是一样的
zshlf
一般會員


發表:18
回覆:11
積分:5
註冊:2003-06-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-17 09:12:39 IP:61.142.xxx.xxx 未訂閱
Select * From TableA Where ( dt1 <= :dt1 ) and (dt2 >= :dt2 ) 注意由 and 连接的两个条件要用()分开
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-17 09:40:17 IP:203.95.xxx.xxx 未訂閱
條件 3 和 4 有問題, 其實時間落點的判斷方式可以簡化, 僅需要判定兩種狀況即可, 弟以圖示說明, 如下圖, 一共有 4個 case, 分別為     1. S, 1, E, 2 2. 1, S, 2, E 3. 1, S, E, 2 4, S, 1, 2, E 觀察一下, 得到 1, 4 組為 dt1 介於 dtStart 及 dtEnd 之間, 2, 3組是 dtStart 介於 dt1 及 dt2 之間, 所以 where condition 可以得到 where (:dt1 <= dt1 and dt1 <= :dt2) or (dt1 <= :dt1 and :dt1 <= dt2) 如此一來即可順利找出符合的資料!!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-17 10:35:34 IP:202.39.xxx.xxx 未訂閱
感謝兩位大大的回覆 小弟比較清楚一點了 小弟依 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 -- 棒球是從兩出局開始的.
系統時間:2024-06-25 14:40:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!