日期的比較及搜尋? |
答題得分者是:folkchen
|
karopi
一般會員 發表:10 回覆:33 積分:8 註冊:2004-07-24 發送簡訊給我 |
資料表如下
欄位分別為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 發送簡訊給我 |
|
karopi
一般會員 發表:10 回覆:33 積分:8 註冊:2004-07-24 發送簡訊給我 |
|
folkchen
高階會員 發表:9 回覆:232 積分:173 註冊:2003-10-09 發送簡訊給我 |
|
karopi
一般會員 發表:10 回覆:33 積分:8 註冊:2004-07-24 發送簡訊給我 |
|
karopi
一般會員 發表:10 回覆:33 積分:8 註冊:2004-07-24 發送簡訊給我 |
|
folkchen
高階會員 發表:9 回覆:232 積分:173 註冊:2003-10-09 發送簡訊給我 |
從下面這行來看
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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
假設 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 發送簡訊給我 |
|
oioio2
一般會員 發表:0 回覆:11 積分:2 註冊:2004-09-08 發送簡訊給我 |
引言: 資料表如下 欄位分別為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 發送簡訊給我 |
oioio2: >> 也許你不服氣...
先聲明,我打這篇不是不服氣,只是小小說明一下 我在前面也有提到
>> 另外一種變數帶入方式,你可以用站內的搜尋功能找
>> Parameter 一個功能有千百種做法是正常的
其他一大篇寫的只是要說明
DB的型態和BCB的型態是不同步的
不是在BCB中定義為float,在DB看到時也一定等同float 你也沒有說錯float在日期加減上會有問題
但是在比較大小是不會有問題的 工具千百種,多會幾個技能是沒有壞處的
我就此打住了 祝大家更上層樓
|
folkchen
高階會員 發表:9 回覆:232 積分:173 註冊:2003-10-09 發送簡訊給我 |
引言: 直接使用日期型態與日期型態比較,不是最簡單嗎? 何必轉來轉去,衍生一堆問題。補充一點 在 ORACLE 中這種寫法不會被轉成 Data Type 存入,它還是被視為文字字串 我知道在 MS 的 DB 中好像會轉(Accress,SQL SERVER) MYSQL 我就不清楚了AnsiString SQL; AnsiString pData; pData = Date().FormatString("yyyy/mm/dd"); SQL = "Select * from TableName Where date >= '" pData "'"; //注意日期要以單引號包住,否則會被視為數字,日期字串送到資料庫系統後,會自動轉為資料庫的日期型態。時間compare的函式?根本不需要! |
karopi
一般會員 發表:10 回覆:33 積分:8 註冊:2004-07-24 發送簡訊給我 |
|
folkchen
高階會員 發表:9 回覆:232 積分:173 註冊:2003-10-09 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |