全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6353
推到 Plurk!
推到 Facebook!

日期的比較及搜尋?

答題得分者是:folkchen
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-02 10:35:31 IP:218.169.xxx.xxx 未訂閱
資料表如下 欄位分別為name--nvarchar type, date--float type name date --------------- aa 20030101 bb 20031226 cc 20010513 dd 20061215 ee 20041001 假設今日日期為2004/9/2 程式應該怎麼寫才能搜尋出date是在2004/9/2之後的資料呢? 是應該把date內的資料轉成字串或日期型別做比較? 還是把2004/9/2轉成float做比較? 哪樣的作法是比較好的呢? 另外 BCB有提供時間compare的函式 可以套在這裡嗎? 謝謝大家
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-02 11:36:36 IP:211.20.xxx.xxx 未訂閱
你好 既然你用了"資料表",那就用SQL去搜尋就好了 你的 Date 欄位用的是float type 一樣可以用 > (大於) 和 < (小於) 來判斷 Select * from TableName Where date >= 20040902
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-02 16:23:55 IP:218.169.xxx.xxx 未訂閱
謝謝folkchen 但如果這個日期是變動的呢? 也就是說每次執行程式時 皆從系統取得當日的日期作比對 這樣也可以把日期轉為float type去做比對嗎?
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-02 16:33:35 IP:211.20.xxx.xxx 未訂閱
AnsiString SQL; AnsiString pData; pData = Now().FormatString("YYYYMMDD"); SQL = "Select * from TableName Where date >= " pData; 或者改成用人工輸入的,也可以 pData = Edit1->Text;
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-02 17:54:26 IP:218.169.xxx.xxx 未訂閱
謝謝folkchen 教我使用Now().FormatString("YYYYMMDD"); 這解決了我很多的問題
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-02 18:53:53 IP:218.169.xxx.xxx 未訂閱
可以再問folkchen一個問題嗎? pData = Now().FormatString("YYYYMMDD"); 此時的pData應該還是AnsiString的型態 他可以直接和資料表中的float型態的數值作比較,而不需轉換嗎?
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-03 08:55:49 IP:211.20.xxx.xxx 未訂閱
從下面這行來看 SQL = "Select * from TableName Where date >= " + pData; 可以發現不管 SQL 中要用什麼 Type 都要先串成 AnsiString ,因為最後要丟給Query...等物件去做事 因為BCB的物件是丟字串給DB DB再依 SQL 字串去決定要做什麼 因此欄位的 Type 要在字串中告訴DB 想一下下面的差異 若 date 的 Type 是 char SQL = "Select * from TableName Where date >= '" pData "'"; 若 date 的 Type 是 date Oracle的寫法如下,不同的DB寫法會不同 SQL = "Select * from TableName Where date >= to_date('" pData "','YYYYMMDD')"; 另外一種變數帶入方式,你可以用站內的搜尋功能找 Parameter
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-03 10:51:49 IP:218.169.xxx.xxx 未訂閱
謝謝folkchen 您說的我大概瞭解 在SQL語法裡,是要先辨別是何種型態 如果是字串型態則為:select * from tablename where fieldname='AAA' 如果是數字型態則為:select * from tablename where fieldname=123 我的問題是 既然一開始就指定pData 是AnsString型態 那麼為什麼他可以寫成像數字型態的模式 "Select * from TableName Where date >= " pData 而非寫成像字串型態的模式 SQL = "Select * from TableName Where date >= '" pData "'" 這裡是我不瞭解的地方 還煩請folkchen不吝指導 謝謝
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-03 11:09:49 IP:211.20.xxx.xxx 未訂閱
假設 pData = "20040903"    SQL = "Select * from TableName Where date >= " + pData; 在DataBase看到 Select * from TableName Where date >= 20040903 會認為是date >= 20040903數字比較 SQL = "Select * from TableName Where date >= '" pData "'"; 在DataBase看到 Select * from TableName Where date >= '20040903' 會認為是date >= '20040903'字串比較 你交給DataBase的一定是字串, 但是DataBase要把你的變數當字串還是當文字, 是要看它在SQL字串中,有沒有單引號來決定的 為了讓 pData 可以串進 SQL 中,所以它必需是 AnsiString 若你的 pData 為了其他的運算不是 AnsiString 那麼在串 SQL 時必需做 Type 的轉換 SQL = "Select * from TableName Where date >= '" (AnsiString)pData "'"; 所以pData不一定要是AnsiString才可以RUN,只要讓它在串SQL時為 AnsiString 就可以了
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-03 17:39:34 IP:218.169.xxx.xxx 未訂閱
這樣我完全懂了 真謝謝你了
oioio2
一般會員


發表:0
回覆:11
積分:2
註冊:2004-09-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-08 11:12:22 IP:218.172.xxx.xxx 未訂閱
引言: 資料表如下 欄位分別為name--nvarchar type, date--float type
日期型態資料就應該使用資料庫的DateTime型態欄位儲存, 只是為了偷懶而直接使用字串(Char,VarChar)或數字(Long Int,float...), 日後只會帶來更多麻煩。 日期型態是一種複雜資料型態,但是現代的程式語言與資料庫幾乎都有支援, 而且都會提供豐富的日期時間函數與運算功能,而且效能與儲存空間比起字串或數字都要好的多,如果沒有提供的建議趕快放棄。 試想你如果要抓取本月份的資料,你得知道本月月底是幾日, 如果是二月份還要考慮閏月問題,如果要抓前三月資料,還要考慮跨年問題, 我看過許多人為此寫了數十行數百行程式寫個萬年曆, 事倍功半,根本是浪費時間。 如果採用日期型態,情況完全改觀。
TDateTime Date1;
Date1 = Date() - 1; // 2004/10/01 - 1天 = 2004/09/30
有沒有注意到,日期型態是可以做加減運算的, 也許你不服氣,說Float也可以運算,請試試看
20041001 - 1; // = 20041000 , 不合法日期
根本無法處理跨月跨年的問題,如果你還不服氣, 說只要寫個if判斷就解決了(也不是那麼簡單), 那麼你可否告訴我20041001是星期幾?是本年度第幾週? 而且日期時間型態還可以做時分秒運算,難不成你都想自己來嗎?
引言: name date --------------- aa 20030101 bb 20031226 cc 20010513 dd 20061215 ee 20041001 假設今日日期為2004/9/2 程式應該怎麼寫才能搜尋出date是在2004/9/2之後的資料呢? 是應該把date內的資料轉成字串或日期型別做比較? 還是把2004/9/2轉成float做比較? 哪樣的作法是比較好的呢? 另外 BCB有提供時間compare的函式 可以套在這裡嗎? 謝謝大家
直接使用日期型態與日期型態比較,不是最簡單嗎? 何必轉來轉去,衍生一堆問題。
AnsiString SQL;
AnsiString pData;    pData = Date().FormatString("yyyy/mm/dd");
SQL = "Select * from TableName Where date >= '"   pData   "'"; 
//注意日期要以單引號包住,否則會被視為數字,日期字串送到資料庫系統後,會自動轉為資料庫的日期型態。
時間compare的函式?根本不需要!
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-09-08 11:52:07 IP:211.20.xxx.xxx 未訂閱
oioio2: >> 也許你不服氣... 先聲明,我打這篇不是不服氣,只是小小說明一下 我在前面也有提到 >> 另外一種變數帶入方式,你可以用站內的搜尋功能找 >> Parameter 一個功能有千百種做法是正常的 其他一大篇寫的只是要說明 DB的型態和BCB的型態是不同步的 不是在BCB中定義為float,在DB看到時也一定等同float 你也沒有說錯float在日期加減上會有問題 但是在比較大小是不會有問題的 工具千百種,多會幾個技能是沒有壞處的 我就此打住了 祝大家更上層樓
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-09-08 12:01:19 IP:211.20.xxx.xxx 未訂閱
引言: 直接使用日期型態與日期型態比較,不是最簡單嗎? 何必轉來轉去,衍生一堆問題。
AnsiString SQL;
AnsiString pData;    pData = Date().FormatString("yyyy/mm/dd");
SQL = "Select * from TableName Where date >= '"   pData   "'"; 
//注意日期要以單引號包住,否則會被視為數字,日期字串送到資料庫系統後,會自動轉為資料庫的日期型態。
時間compare的函式?根本不需要!
補充一點 在 ORACLE 中這種寫法不會被轉成 Data Type 存入,它還是被視為文字字串 我知道在 MS 的 DB 中好像會轉(Accress,SQL SERVER) MYSQL 我就不清楚了
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-09-14 23:28:25 IP:218.167.xxx.xxx 未訂閱
當初的資料是由Execel檔匯入MS SQL 所以才會出現日期的部分屬於float type 因為我實在是找不到夠基礎的書能夠教我 如何把這float type的資料轉回date type 而且還要能保證資料的完整性和正確性 因此才會求助於各位大大 如果有人能夠教我如何把這些float tpye轉回成date type 那的確會省事更多 因為BCB裡就提供很多時間的函式 不過還是謝謝兩位大大的指教
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-09-15 08:43:27 IP:211.20.xxx.xxx 未訂閱
BCB是有不少時間函數可以用,但是一定要先有一個觀念 你要明確的知道,那些事要在DB上做,那些要在BCB做 總不能把10萬筆的資料全都抓到CLIENT 再用BCB的函數去處理去篩選 最好是用SQL把資料篩選到只剩下你要的資料筆數 再抓到CLIENT處理DB不能做的事 要寫資料庫的程式,SQL很重要 關連式資料庫的重點,就是要怎麼拆Table 相對的,你也要會組合Table才行 它直接影嚮的就是效率    有點離題了,重點就是 1.要清楚SQL和BCB各是不同的語言,但同時存在於程式中 2.要清楚什麼要在SQL做,什麼要在BCB做 3.要清楚怎麼寫是要在SQL做,怎麼寫是要在BCB做 4.還有一定要熟悉你的資料庫,各種資料庫都有它自己的特性,一定要去了解 Oracle單單DBA的課5天要3.6萬,其他相關課程加起來要10多萬才上的完,有它的原因在的,當你的資料量大到一定的程度時,就不只是丟一個SQL出去這麼簡單而已,我也沒有碰過 100G 以上的資料庫,也是聽朋友說的 P.S:Oracle有 Sub Query的功能,幾乎可以在一個SQL就在DB端完成大多數的作業,Work Table、巢狀迴圈等等都不用做了,一個SQL就可以做好了 >> 如果有人能夠教我如何把這些float tpye轉回成date type 你試試看,在Excel中把那整欄的儲存格格式設成日期的格式,它就會自動轉格式,再將它轉進 MySQL 試試看 我沒有實際做過,但想法上應該可行才對 不然就要存成 .csv 檔或 .txt檔 再用BCB讀檔轉格式存入DB 發表人 - folkchen 於 2004/09/15 08:48:54 發表人 - folkchen 於 2004/09/15 08:52:38
karopi
一般會員


發表:10
回覆:33
積分:8
註冊:2004-07-24

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-09-16 12:54:34 IP:218.169.xxx.xxx 未訂閱
謝謝 folkchen 我會試試看的
系統時間:2024-05-05 20:07:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!