暫存Table處理 |
尚未結案
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
參考一下: 你可以用filter的做法 例如 :
query1.close; query1.filter := // 你要過濾的條件 query1.filtered := True; query1.open;這樣就可解決1,2的問題 而不用作暫存的動作 至於第3點 則是filter是把query元件select出來的資料 再select一次 有像SQL的子查詢 但是QUERY的筆數是要算query元件所select出來的資料 而不是filter的筆數(雖然你只能看到filter的資料 其他的看不到) 但SQL的子查詢就直接算所查詢出來的筆數 所以這兩種的比數會不一樣 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2003/04/18 17:06:46 發表人 - T.J.B 於 2003/04/18 17:09:42
------
天行健 君子當自強不息~~@.@ |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
我的Table中有兩個欄位是和日期有關
A,B,date1,date2 我現在要做的是取date2的當月份最後一天--(20030415-->20030430)
然後再select 出 date1>date2的當月份最後一天的所有資料 所以我先用一個TQuery Select 出所有資料
然後再計算出date2的當月份最後一天
再做一次Selectdate1>date2的當月份最後一天的所有資料 如果使用兩位前輩的方法請問我要如何做? ps.date2的當月份最後一天我用自製函數可以算出
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
請先說明你的資料庫種類.
以下假設是支援 subquery 的作法. select * from tablea where date1 > (select max(date2) from tablea where date2 between '2003/04/01' and '2003/05/01') and date1 >= '2003/4/1' 其中 subquery 是找 4 月份 date2 出現的最後一天.
外面的主 query 是 date1 是 4月份且大於 subquery 出來的 date2
條件可以依你實際的狀況再作修改...
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
我可能表達不清楚造成chih,timhuang 兩位誤會 不是當月份所有資料也不是找 4 月份 date2 出現的最後一天.
我是要經由date2的日期找出date2的該月份的最後一天
ex.
date2,我求算出來的日期
======================
20030601,20030630
20030525,20030531
20030224,20030228 就是這樣
但是我的重點不是以上
我想問的重點是我已經可以求出date2當月的份的最後一天的日期
接下來我要如何做可以一個TQuery就可以得到我想要的資料
date1>date2當月的份的最後一天的日期 再次請教各位 Thank You
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
你的問題很明顯的是要由 date2 再找 date2 當月的最後一天.
然後再下 query 找出 date1 > date2 當月的最後一天 的資料, 那含不含最後一天呢?
如:
20030525,20030531
date2 = 2003/5/25 , date2 的當月最後一天是 2003/5/31.
你要找的資料是 date1 > 2003/5/31 沒錯吧. 若是會含最後一天的話, 2003/5/31 這個日期就會出現在 query 之中,
select ... from tablea where date1 >= '2003/5/31' 若是不含最後一天的話, 其實就是 下個月起的所有資料沒錯吧~ 所以 query就會是:
select ... from tablea where date1 >= '2003/6/1' (可以用 2003/5/31 1天來得到) 那另外, 由於 date2 也是 tablea 中的其中一欄, 所以上面的 query 的條件得都要修改一下, 將 date2 帶入 query 中, 要注意的地方是找 date2 該月的最後一天不好找, 但是找 date2 下個月的第一天是比較容易的, 所以找法可以利用找下個月的第一天再減一天就可以得到 date2 該月份的最後一天了. 由於資料庫種類你一直沒提, 以下的 query 假設是 mssql 的語法: 若 date2 是 2003/5/25, 則 convert(datetime, left(convert(varchar, dateadd(m,1, date2 ), 111),7) '/01') 會轉為 2003/6/1 所以若含最後一天的語法為:
select ... from tablea where date1 >= (convert(datetime, left(convert(varchar, dateadd(m,1,date2), 111),7) '/01') - 1) 若不含最後一天的語法為:
select ... from tablea where date1 >= convert(datetime, left(convert(varchar, dateadd(m,1,date2), 111),7) '/01')
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
請問一下你可以將計算date2的公式寫出來嗎??你應該是丟date1進去在算出date2吧??
引言: 我可能表達不清楚造成chih,timhuang 兩位誤會 不是當月份所有資料也不是找 4 月份 date2 出現的最後一天. 我是要經由date2的日期找出date2的該月份的最後一天 ex. date2,我求算出來的日期 ====================== 20030601,20030630 20030525,20030531 20030224,20030228 就是這樣 但是我的重點不是以上 我想問的重點是我已經可以求出date2當月的份的最後一天的日期 接下來我要如何做可以一個TQuery就可以得到我想要的資料 date1>date2當月的份的最後一天的日期 再次請教各位 Thank You |
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
*** 我的資料庫是DB2 *** date2不是經由date1計算出來的 我說明一下我在提出問題之前所想到要處理的想法 1. TQuery1:Select * from TableA
2. 然後再取出所有TableA的所有欄位的值
3. 使用自製函數求出date2的該月份的最後一天(假設是Date3)
4. TableA Date3存到一個暫存的TableB
5. 在以一個TQuery2:Select * From TableB where Date1>Date3
6. 將資料秀在DBGrid上 就這樣,請各位前輩再指教. PS. 很抱歉一時無法提供計算date2的公式
(我是使用自製函數計算出的)
明天我再將計算date2當月最後一天的函數寫出來.
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
如果Date2是這樣有二個資料的話,那你應該用date2的筆數做迴圈去SELECT資料.
for i = 1 to x do //x是Date2共有幾筆
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.ADD(' Select * From TableB where Date1 between ' #39 Date2(1) #39 ' AND ' #39 Date2(2) #39);//Date2(1)->'20030601',Date2(2)->'20030630'
Query1.open;
Query1.First
while not Query1.eof do
begin
//這裡把Select出來的資料丟進TempTable
end;
end;
TRY TRY SEE
引言: ex. date2,我求算出來的日期 ====================== 20030601,20030630 20030525,20030531 20030224,20030228發表人 - chih 於 2003/04/21 09:03:10 |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
[/quote]
1. TQuery1:Select * from TableA
2. 然後再取出所有TableA的所有欄位的值
3. 使用自製函數求出date2的該月份的最後一天(假設是Date3)
4. TableA Date3存到一個暫存的TableB
5. 在以一個TQuery2:Select * From TableB where Date1>Date3
6. 將資料秀在DBGrid上
[/quote] 若是這樣的話, 其實不用自製函數, 在 sql 中就可以解決了, 何必將資料全部帶出再到 client 端處理呢? 這樣不僅效能差, 而且資料量多的時候問題會更多, 弟的前一篇提到的方法應該就可以處理你的問題了, 只是其中 convert 函數對應於 db2 的語法可能要麻煩你自己再查一下, 該函數是作資料型態的轉換, db2 應該會有對應的功能. 而且其中的由 date2 找出該月的最後一天也是由 db 直接完成, 所以也不會用到 temp table 的, 這樣的效能才是比較理想, 也是較佳的處理方式!
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
以下是我計算月底日期的函數 function DaysOfMonth(sNMdate : String) : String;
var
sYear, sMonth, sDay : String;
sMonth1,sYear1:Integer;
begin
sYear:=copy(sNMdate,1,4);
sMonth:=copy(sNMdate,5,2);
sDay:=copy(sNMdate,7,2);
sMonth1:=strtoint(sMonth);
sYear1:=strtoint(sYear);
Case sMonth1 of
1,3,5,7,8,10,12 :
result := sYear+sMonth+'31';
4,6,9,11 :
result := sYear+sMonth+'30';
2 :
if ((sYear1 mod 4 = 0) and ((sYear1 mod 100<>0) or (sYear1 mod 400 = 0))) then
Result:=sYear+sMonth+'29'
else
Result:=sYear+sMonth+'28';
else
Result:='';
end;
end;
showmessage(daysofMonth('20040201')); ==> 20040228
請先不要考慮執行效率的問題,即使問題沒有完美的解決,但還是有其學習的價值 我個人認為暫存Table的使用還是蠻重要的,可否講解一下
如何將TQuery1 Select出來的結果存在暫存Table(TableB)
又如何利用TQuery2 將TablB Select 出來 請各位再指教 Thank You!
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
引言: 以下是我計算月底日期的函數 function DaysOfMonth(sNMdate : String) : String; ... 請先不要考慮執行效率的問題,即使問題沒有完美的解決,但還是有其學習的價值 我個人認為暫存Table的使用還是蠻重要的,可否講解一下 如何將TQuery1 Select出來的結果存在暫存Table(TableB) 又如何利用TQuery2 將TablB Select 出來基本上, 要 select 到 temp table 是不能利用 client 的 function 的, 所以你寫的 function 對於 select 進 temp table 是沒有意義的, 再者和你說明, 除了使用 filter 以外的方式外, 不能對 dataset 這種元件再下 sql command 來找出資料. 若是你想要學習 temp table 的用法其實不難, 我將我前面回答的問題再修改一下就可以達到你要的 temp table 解法: select *, convert(datetime, left(convert(varchar, dateadd(m,1,date2), 111),7) '/01') - 1 as date3 into #tmp from tablea --其中 #tmp 就是 temp table select * from #tmp where date1 > date3 drop #tmp 這樣就可以了 |
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |