sql查询的问题 |
尚未結案
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
lwd188兄所提的SQL查詢語法並不是問題,我感覺有問題的是你所訂定的資料表結構!按照你的資料表我建議將「改用途備註」一欄再分為「日期」與「原因」(如歇業等字眼)二欄,如此才能符合關連式資料庫的原則,否則由「改用途備註」取出的值,是不是先要分析哪些是日期,哪些是原因?才來做SQL查詢呢?更況且如果分析出來的值有錯,那SQL查詢語法也得不到正確的值,建議先改進你的資料表結構才是!請參考。 -----------------------------------------------
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
nlmnrke
一般會員 發表:5 回覆:16 積分:4 註冊:2004-11-17 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
var Note,SQLString:String' aDate:TDateTime; ....//假設你用別的方法分別已取出欄位中的值 Note := '歇业'; aDate := '2005/5/5'; SQLString := 'Select DATEDIFF(day, aDate, GetDate()) AS NoDay From 資料表 Where NoDay > 30 In ( Selet * From 資料表 Where 改用途备注 Like ' '%' Note '%' ')''';大概寫了一個類似的範例,未測試過!希望可以給你一點思考,請參考! ----------------------------------------------- |
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
引言: 如果欄位真的要這樣用.... 2005-05-05 前面日期字碼一定要固定 1234碼為年 5碼為- 67碼為月 8碼為- 910碼為日 然後再判斷時 用sql函數取碼 substring(欄位,開始碼,取幾個字) substring('2005-05-05歇业',1,4)====>2005(年) substring('2005-05-05歇业',6,2)====>05(月) substring('2005-05-05歇业',9,2)====>05(日)谢谢nlmnrke和Stallion 兄 我看了nlmnrke兄的提示我照做了一个但执行后提示substring函数没定义不知道为什么?希望兄再给指点迷津. 我做的如下 str:='update 户 set 协议计租月份 =''' MaskEdit1.Text ''' where substring(改变用途备注,9,4)=''歇业'''; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(str); ADOQuery1.ExecSQL; |
nlmnrke
一般會員 發表:5 回覆:16 積分:4 註冊:2004-11-17 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
引言: update 户 set 协议计租月份 =''' MaskEdit1.Text ''' where substring(改变用途备注,9,4)=''歇业''' 這樣下 危險性很高.... 只要是有這個條件,都會被update 如果要知道你substring什麼值,你可以先用一個查詢 Select substring([改变用途备注],10,4) as FindName From [户] 再Showmessage 最重要的,欄位名稱 用英文吧....不然愈寫愈多 你打字會愈來愈強谢谢nlmnrke兄的提醒,不过我要的就是这个效果.数据库是别人以前就建好的.我不能动. 我按照兄的提示去做.随便建个程序设个条件试了一下.运行后总提示substring函数没有定义错误.不知到什么原因,望兄再给予指点. |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
nlmnrke
一般會員 發表:5 回覆:16 積分:4 註冊:2004-11-17 發送簡訊給我 |
(monthsbetween(now,strtodatetime(mid(trim(改用途备注),1,8)))>=1) and (strtoint(FormatDateTime('dd',now))>=strtoint(mid(trim(改用途备注),7,2))) FormatDateTime('YYYY/MM/DD', Now)可以取得目前的電腦日期格式為2005/06/24
再用delphi函數copy 即可做到你用的語法
如
SYear:=copy(FormatDateTime('YYYY/MM/DD', Now),1,4) 會得到2005
SMonth:=copy(FormatDateTime('YYYY/MM/DD', Now),6,2) 會得到06
這樣 你應該會懂.......試試吧.....
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
您好﹗cashxin2002兄
当我执行如下的那段代码后,出现这样的错误提示:"标准表达式中数据类型不批配".望兄帮我瞅瞅.
代码如下:
str:='update 户 set 协议计租月份 =''' MaskEdit1.Text ''' where mid(改用途备注,9,4) and (Month(Now)-CInt(Mid(Trim(改用途备注),1,8)))>=1';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(str);
ADOQuery1.ExecSQL; 發表人 - lwd188 於 2005/06/24 18:55:27
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 請檢查如下紅色處﹕
str:='update 户 set 协议计租月份 ='''+MaskEdit1.Text+''' where
mid(改用途备注,9,4) and
(Month(Now)-CInt(Mid(Trim(改用途备注),1,8)))>=1';
//以上紅色處缺少條件式的關鍵字和右半邊內容﹒ =================================
有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗
================================
------
忻晟 |
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
噢,是我的疏忽,忘加了"歇业".不过跟这个没关系.一执行就有:"标准表达式中数据类型不批配".
str:='update 户 set 协议计租月份 =''' MaskEdit1.Text ''' where
mid(改用途备注,9,4)=''歇业'' and
(Month(Now)-CInt(Mid(Trim(改用途备注),1,8)))>=1'; 改成以下的代码,提示的错误一样
str:='update 户 set 协议计租月份 =''' MaskEdit1.Text ''' where (Month(Now)-CInt(Mid(Trim(改用途备注),1,8)))>=1';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(str);
ADOQuery1.ExecSQL;
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 這樣的子查詢會回傳的內容可能不止一個﹐所以才會出錯﹒ 如果改用備注字段中日期部分的值格式為﹕yyyymmdd﹐請參考如下﹕
str:='update 戶 set 協議計租月份 ='''+MaskEdit1.Text+''' where
Mid(改用途備注,9,4)=''歇業'' and
(CInt(Month(Now))-CInt(Mid(Trim(改用途备注),5,2)))>=1 and
協議計租月份 is not Null'; 如果改用備注字段中日期部分的值格式為﹕ddmmyyyy﹐請參考如下﹕
str:='update 戶 set 協議計租月份 ='''+MaskEdit1.Text+''' where
Mid(改用途備注,9,4)=''歇業'' and
(CInt(Month(Now))-CInt(Mid(Trim(改用途备注),3,2)))>=1 and
協議計租月份 is not Null'; 如果改用備注字段中日期部分的值格式為﹕mmddyyyy﹐請參考如下﹕
str:='update 戶 set 協議計租月份 ='''+MaskEdit1.Text+''' where
Mid(改用途備注,9,4)=''歇業'' and
(CInt(Month(Now))-CInt(Mid(Trim(改用途备注),1,2)))>=1 and
協議計租月份 is not Null'; 如果改用備注字段中日期部分的值格式為﹕yyyyddmm﹐請參考如下﹕
str:='update 戶 set 協議計租月份 ='''+MaskEdit1.Text+''' where
Mid(改用途備注,9,4)=''歇業'' and
(CInt(Month(Now))-CInt(Mid(Trim(改用途备注),7,2)))>=1 and
協議計租月份 is not Null'; =================================
有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗
================================
------
忻晟 |
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
cashxin2002 兄好
在此再次表示万分的感谢!
怪我没说清楚!"改用途备注"字段,是做个临时的备注字段.字段的格式可以是如下几种:
"yy-mm-dd歇业"或"停业"或"0402"或什么也不填为空值,或任意其他的备注说明.格式不是固定的.(要是带歇业字眼的,格式是固定为"yy-mm-dd歇业"的)
我只是想在这个字段里取出带有"歇业"字眼的,并且是取出如"yy-mm-dd歇业"这样的格式里月份和日期,判断是否大于一个月?如果大于一个月,就把这条记录里的"改用途备注"字段清空.
如兄所说的我都试了,不行.总是提醒"标准表达式中数据类型不批配".的提示.
(另外和"協議計租月份"这个字段没关系.它只是我用来试验的.我最终是想实现:当大于一个月的条件满足就把相应的那条记录里的"改用途备注"字段的内容清空.)
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 先用如下的SQL語法來測試看看Month函數和CInt函數是否可行﹐在任何一個連接上Database的ADOQuery元件或ADODataSet皆可﹒
Select CInt(Month(Now))-1 如果可行﹐請在專案中試試如下SQL敘述﹕
Str:='Update 戶 set 改用途備注 = Null where
改用途備注 is not Null and
Mid(改用途備注,9,4)=''歇業'' and
(CInt(Month(Now))-CInt(Mid(Trim(改用途备注),4,2))>=1'
//另外﹐在您的SQL敘述中﹐發現如上紅色的右括號處多使用了一個右括號﹐先將其刪除 =================================
有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗
================================
------
忻晟 |
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
引言: 您好﹗ 先用如下的SQL語法來測試看看Month函數和CInt函數是否可行﹐在任何一個連接上Database的ADOQuery元件或ADODataSet皆可﹒ Select CInt(Month(Now))-1 如果可行﹐請在專案中試試如下SQL敘述﹕ Str:='Update 戶 set 改用途備注 = Null where 改用途備注 is not Null and Mid(改用途備注,9,4)=''歇業'' and (CInt(Month(Now))-CInt(Mid(Trim(改用途备注),4,2))>=1' //另外﹐在您的SQL敘述中﹐發現如上紅色的右括號處多使用了一個右括號﹐先將其刪除 ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================谢谢cashxin2002兄 现在问题是这样的: 我把所有记录里的"改用途备注"字段里全填入"04-05-12歇业"时,用这个代码执行没问题. 但当我把其中任一条记录里的"改用途备注"字段改为"停业"时就出现:"标准表达式中数据类型不批配"的提示. 说明这段代码没有实现:"先过滤带"歇业"字眼的记录,然后在已过滤好的记录里在选择月份大于1"的功能. 望兄在给我把把脉. 發表人 - lwd188 於 2005/06/29 22:40:04 |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 試試這樣﹕
Str:='Update 戶 set 改用途備注 = Null where
改用途備注 is not Null and Len(改用途備注)>=12 and
Mid(改用途備注,9,4)=''歇業'' and
(CInt(Month(Now))-CInt(Mid(Trim(改用途备注),4,2))>=1' =================================
有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗
================================
------
忻晟 |
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 您用子查詢的想法應可行﹐試試如下﹕
Str:='Update 戶 set 改用途備注 = Null where
鍵值欄位 In (Select 鍵值欄位 From 戶 Where Len(改用途備注)>=12 and
Mid(改用途備注,9,4)=''歇業'') and
(CInt(Month(Now))-CInt(Mid(Trim(改用途备注),4,2))>=1' P.S 您太客氣了﹐雖然回答了那么久﹐但還是沒有解決問題﹐應是小弟感到抱歉﹒ =================================
有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗
================================
------
忻晟 |
lwd188
一般會員 發表:13 回覆:33 積分:9 註冊:2005-02-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |