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

【AccessSQL】關於select指定月份的語法請教

答題得分者是:sos_admin
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-26 17:55:55 IP:203.70.xxx.xxx 未訂閱
各位前輩大家好~ 我的問題是要找設定月份的資料記錄 我的資料庫:Access XP    我的資料表如下: tabel => A    na|   date   |  money| ==|======|=====| A |2003/2/1  |    100    | B |2003/2/8  |    200    | C |2003/3/4   |    500    | D |2003/2/27|    300    | E |2003/5/1  |    600    |    我的表單上有: 1,一個ComboBox的元件,是用來選擇本年的月份,其name => cmbMonth 2,一個「查詢」的button按鈕 3,DBGrid、ADOQuery …相關資料連結元件 ================================================== 問題是這樣的: 我想讓使用者先於cmbMonth上點選月份(假設我點選2,也就是2月份), 接著再點按「查詢」的按鈕,則資料會顯示出本年二月份的所有資料, 如 na| date | money| ==|======|=====| A |2003/2/1 | 100 | B |2003/2/8 | 200 | D |2003/2/27| 300 | 據我所知OracleSQL中有一個日期格式為:to_date('2003XXYY','yyyymmdd') 可以這樣去篩選日期的資料, 如我可以下: select * from A where date = to_date('200302','yyyymm') 而程式可以這樣寫: sql:='select * from A where date = to_date(''' IntToStr(CurrentYear) cmbMonth.text ''',''yyyymm'')'; with adqCas01 do begin Close; Sql.Clear ; Sql.Add(sql); Open; end; 但,就是不知道AccessSql該如何應用~(^︵^"") 我已經找了好多篇文章…還有翻了我自己所有的書籍… 可能自己還是太嫰了…仍找不到我想要的解答… 希望前輩們能不厭其煩地為我解惑~ 謝謝~太麻煩前輩們了…
Winifred
初階會員


發表:3
回覆:34
積分:47
註冊:2002-07-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-26 18:14:51 IP:61.221.xxx.xxx 未訂閱
您好 我試了一個比較簡單的方法 不知道對您有沒有幫助 我把語法改成 'Select * from A where date like ' CHR(39) IntToStr(CurrentYear) '/' cmbMonth.text '%' CHR(39); 不知道這樣會不會是您要的 發表人 - winifred 於 2003/08/26 18:24:24
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-26 18:15:05 IP:61.155.xxx.xxx 未訂閱
在〔如何查找設定月份之間的紀錄? 〕中已经帮您解答了 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=36350 發表人 - sos_admin 於 2003/08/26 18:16:49
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-26 21:22:30 IP:61.56.xxx.xxx 未訂閱
你好: 下列方式我用過,給你參考 < class="code"> function FirstDay (Date : TDateTime) : TDateTime; var Y, M, D : Word; begin DecodeDate (Date, Y, M, D); Result := EncodeDate (Y, M, 1); end; function LastDay (Date : TDateTime) : TDateTime; var Y, M, D : Word; begin DecodeDate (FirstDay (Date), Y, M, D); Result := EncodeDate (Y, M, 1); result := result - EncodeTime (0, 0, 0, 1); end; SQL := format ('Select * From DateTerm Where CheckDate between #%s# and #%s#', [DateToStr (FirstDay (SelDate)), DateTimeToStr (LastDay (SelDate))])
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-27 00:39:50 IP:203.70.xxx.xxx 未訂閱
引言: 在〔如何查找設定月份之間的紀錄? 〕中已经帮您解答了 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=36350 to uuujjj : 同上,思想就是将 年*12+月 得出的数字比较就可以了 'select * from A where (year(date)*12 month(date))=' inttostr(CurrentYear*12 strtoint(cmbMonth.text)) '' 發表人 - sos_admin 於 2003/08/26 18:16:49
感謝sos_admin版友您的指導\(^0^)/ 真的成功了~而且,語法簡易~真的非常的感謝~又學到一招了~(^__^) 真Happy呀~ 不過,我可以請教一下您一個疑問嗎? 我發現有關「年份」的函式都乘以12了, 'select * from A where (year(date)*12 month(date))=' IntToStr(CurrentYear*12 StrToInt(cmbMonth.text)) '' 紅色字部份為何都要乘12呢?? 因為取年的數值出來了卻又*12 ??? (感覺就好像是2003*12 =24036 < >) 這代表何種含意呢???? 不好意思,又麻煩您了~< > =============================================== 呃…對不起…(^^") 我剛回那主題去看了一遍,發現sos_admin版友已經有提出why了…^^" 原來是讓它的值來做比較呀… 真的太神了…也可以用這種方法來select 不過,我發現不用乘12也行得通呢~^^ 'select * from A where (year(date) month(date))=' IntToStr(CurrentYear StrToInt(cmbMonth.text)) 呵呵呵~原來如此~稍微瞭解了… 發表人 -
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-27 00:45:27 IP:203.70.xxx.xxx 未訂閱
引言: 你好: 下列方式我用過,給你參考 < class="code"> function FirstDay (Date : TDateTime) : TDateTime; var Y, M, D : Word; begin DecodeDate (Date, Y, M, D); Result := EncodeDate (Y, M, 1); end; function LastDay (Date : TDateTime) : TDateTime; var Y, M, D : Word; begin DecodeDate (FirstDay (Date), Y, M, D); Result := EncodeDate (Y, M, 1); result := result - EncodeTime (0, 0, 0, 1); end; SQL := format ('Select * From DateTerm Where CheckDate between #%s# and #%s#', [DateToStr (FirstDay (SelDate)), DateTimeToStr (LastDay (SelDate))])
感謝ha0009的進階型函數應用的寫法~(^ ^") 這也讓我吸收到不少呢,謝謝您喔~ 我想這種運用函數的方法,以後一定會遇到!! 謝謝您提供經驗…
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-27 01:02:38 IP:203.70.xxx.xxx 未訂閱
引言: 您好 我試了一個比較簡單的方法 不知道對您有沒有幫助 我把語法改成 'Select * from A where date like ' CHR(39) IntToStr(CurrentYear) '/' cmbMonth.text '%' CHR(39); 不知道這樣會不會是您要的 發表人 - winifred 於 2003/08/26 18:24:24
感謝winifred版友的提供~(^^)/ 我試過了,不過,因為我的date是屬於日期格式… 而不是文字格式,大概是因為這樣, 所以like比較出來後有錯誤訊息出現…「少了運算元」 我會再try try看、修看看的,感謝您的指導~(^__^)
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-27 01:33:47 IP:203.70.xxx.xxx 未訂閱
因為sos_admin前輩使用的是數值相加來做為比較, 對於月份期間(如3~5月份)的用法有很大的功效, 另外,我依sos_admin前輩的方式,做了個小幅度的變化, 想說,可以用數值來比較,如果換成字串的話,不知如何, 因此,就完成了下列這段語法:    sql= 'select * from A where (Cstr(year(date)) Cstr(month(date)))=''' IntToStr(CurrentYear) cmbMonth.text '''' 謝謝各位的指導,以上是心得寫出來的,供大家參考^^
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-27 07:51:27 IP:61.155.xxx.xxx 未訂閱
uuujjj 兄:    最好用 年*12+月,意思是合计月数(一年12个月吗!); 如果不用 年*12+月,而用 年+月,效果就不行的了,如下: 年+月 2002-11 与 2001-12 那么不都为2013了,比较就会相同了。 不对 年*12+月 2002-11 与 2001-12 那么为24035、24024了,比较就会不相同
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-27 13:51:50 IP:211.74.xxx.xxx 未訂閱
感謝sos_admin前輩細心的說明與指導,謝謝您~^^ 原來乘以12就是要代表有12個月,以月來做總計比較~ 呵~因為是用西元的,一時沒大悟~ 此法不論是西元還是民國年,都行得通呢~ 嗯~果然是好的方法~ 感謝您說明的如此詳細~ \(_ _)/ 太感激了~
系統時間:2024-07-01 20:15:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!