線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3358
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

sql查&#35810;的&#38382;&#39064;

尚未結案
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-23 15:29:09 IP:218.25.xxx.xxx 未訂閱
各位大大好!我用的ACCESS数据库,ADO链接.其中有个"改用途备注"字段. "改用途备注"字段里的数据如 "2005-05-05歇业" 如何用SQL查询实现:如果"改用途备注"=歇业 and "改用途备注"里月份大于一个月 and 日期<15 then 改用途备注字段付空值. 查询实现的函数我不熟,请各位大大帮忙,谢谢.
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-23 16:29:01 IP:211.22.xxx.xxx 未訂閱
lwd188兄所提的SQL查詢語法並不是問題,我感覺有問題的是你所訂定的資料表結構!按照你的資料表我建議將「改用途備註」一欄再分為「日期」與「原因」(如歇業等字眼)二欄,如此才能符合關連式資料庫的原則,否則由「改用途備註」取出的值,是不是先要分析哪些是日期,哪些是原因?才來做SQL查詢呢?更況且如果分析出來的值有錯,那SQL查詢語法也得不到正確的值,建議先改進你的資料表結構才是!請參考。 -----------------------------------------------
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-23 19:06:57 IP:218.25.xxx.xxx 未訂閱
[quote] lwd188兄所提的SQL查詢語法並不是問題,我感覺有問題的是你所訂定的資料表結構!按照你的資料表我建議將「改用途備註」一欄再分為「日期」與「原因」(如歇業等字眼)二欄,如此才能符合關連式資料庫的原則,否則由「改用途備註」取出的值,是不是先要分析哪些是日期,哪些是原因?才來做SQL查詢呢?更況且如果分析出來的值有錯,那SQL查詢語法也得不到正確的值,建議先改進你的資料表結構才是!請參考。 谢谢>'歇业' >=>=
nlmnrke
一般會員


發表:5
回覆:16
積分:4
註冊:2004-11-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-23 19:17:31 IP:211.23.xxx.xxx 未訂閱
如果欄位真的要這樣用.... 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(日)
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-23 19:36:32 IP:211.22.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-23 22:56:18 IP:218.25.xxx.xxx 未訂閱
引言: 如果欄位真的要這樣用.... 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-24 08:38:03 IP:202.39.xxx.xxx 未訂閱
update 户 set 协议计租月份 ='''+MaskEdit1.Text+''' where substring(改变用途备注,9,4)=''歇业'''    這樣下  危險性很高.... 只要是有這個條件,都會被update 如果要知道你substring什麼值,你可以先用一個查詢 Select substring([改变用途备注],10,4) as FindName From [户] 再Showmessage  最重要的,欄位名稱 用英文吧....不然愈寫愈多 你打字會愈來愈強
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-24 09:35:52 IP:218.25.xxx.xxx 未訂閱
谢谢nlmnrke兄的提醒,不过我要的就是这个效果.数据库是别人以前就建好的.我不能动. 我按照兄的提示去做.随便建个程序设个条件试了一下.运行后总提示substring函数没有定义错误.不知到什么原因,望兄再给予指点.
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-24 09:38:33 IP:218.25.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-24 11:11:49 IP:202.62.xxx.xxx 未訂閱
您好﹗    Access資料庫不支援SubString的SQL語法﹐改用Mid代替SubString即可﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-24 12:03:04 IP:218.25.xxx.xxx 未訂閱
谢谢cashxin2002兄,果然如兄所说.改成Mid就成了.不过还有一个请求,望兄不吝赐教. 在SQL有没有类示以下的函数(或以下的功能怎么在SQLl查询里实现)(以下那段代码我为了实现大于一个月而写) (monthsbetween(now,strtodatetime(mid(trim(改用途备注),1,8)))>=1) and (strtoint(FormatDateTime('dd',now))>=strtoint(mid(trim(改用途备注),7,2)))
nlmnrke
一般會員


發表:5
回覆:16
積分:4
註冊:2004-11-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-24 13:52:08 IP:211.23.xxx.xxx 未訂閱
(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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-24 14:10:09 IP:202.62.xxx.xxx 未訂閱
您好﹗    在Access資料庫的SQL中可使用如下語法﹕ (Month(Now)-StrToInt(Mid(Trim(改用途备注),1,8)))>=1 或者﹕ (Month(Now)-CInt(Mid(Trim(改用途备注),1,8)))>=1    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-24 15:07:25 IP:218.25.xxx.xxx 未訂閱
谢谢cashxin2002兄 可是用这个(Month(Now)-StrToInt(Mid(Trim(改用途备注),1,8)))>=1 提示strtoint没有定义 用这个(Month(Now)-CInt(Mid(Trim(改用途备注),1,8)))>=1 类型不对 不知什么原因,兄受累了
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-06-24 16:00:44 IP:202.62.xxx.xxx 未訂閱
您好﹗    CInt函數是屬于SQL轉換函數﹐其作用是將傳回的資料轉換成整數形態﹒ CInt的部分﹐小弟已在Access中測試通過﹐應可正常使用﹒    您太客氣了﹐能為大家服務是小弟的榮幸﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-06-24 18:53:20 IP:218.25.xxx.xxx 未訂閱
您好﹗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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-06-24 19:44:07 IP:202.62.xxx.xxx 未訂閱
您好﹗    請檢查如下紅色處﹕ 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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-06-24 20:09:22 IP:218.25.xxx.xxx 未訂閱
噢,是我的疏忽,忘加了"歇业".不过跟这个没关系.一执行就有:"标准表达式中数据类型不批配". 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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-06-24 20:19:19 IP:202.62.xxx.xxx 未訂閱
您好﹗    試試這樣﹕ str:='update 户 set 协议计租月份 ='''+MaskEdit1.Text+''' where  (CInt(Month(Now))-CInt(Mid(Trim(改用途备注),1,8)))>=1';    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-06-24 20:35:44 IP:218.25.xxx.xxx 未訂閱
cashxin2002兄好 我想原因是否是这样? "改用途备注"字段,有的是空值.结果取值时就出错. 我改成这样就可以了 str:='update 户 set 协议计租月份 =''' MaskEdit1.Text ''' where (Month(Now)-CInt(02))>=1'; 兄看是不是这个原因,要是这个原因该怎么解决?那个字段里不可能都有值呀...
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-06-24 21:51:07 IP:202.62.xxx.xxx 未訂閱
您好﹗    在SQL敘述中再加上一個條件判斷試試﹕ Where 协议计租月份 is not Null    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#22 引用回覆 回覆 發表時間:2005-06-25 21:10:06 IP:218.25.xxx.xxx 未訂閱
cashxin2002兄好 原因应该是这样的: 当临时有歇业的用户时,就在"改用途备注"里写入当时的日期如:"05-05-06歇业" 当有别的情况时内容可能填入"2004年11月关业" 或公房变私房时填入"住宅". 这样用(Month(Now)-CInt(Mid(Trim(改用途备注),1,8)))>=1这段代码取值就可定会出现:"标准表达式中数据类型不批配".的提示 兄看要是这样该怎么解决? 發表人 - lwd188 於 2005/06/25 21:11:53
lwd188
一般會員


發表:13
回覆:33
積分:9
註冊:2005-02-11

發送簡訊給我
#23 引用回覆 回覆 發表時間:2005-06-27 23:56:45 IP:218.25.xxx.xxx 未訂閱
为了解决这个问题,我加了个子查询代码如下: select * from 户 where (month(now)-cint(mid(trim((select 改用途备注 from 户 where mid(trim(改用途备注),9,4)='歇业')),1,2))>1) 但执行后提示"子查询最多能返回亦个记录" 怎么办,是不是我子查询的位置不对?写法错误? 望各位大大帮我看看
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#24 引用回覆 回覆 發表時間:2005-06-28 22:44:53 IP:202.62.xxx.xxx 未訂閱
您好﹗    這樣的子查詢會回傳的內容可能不止一個﹐所以才會出錯﹒    如果改用備注字段中日期部分的值格式為﹕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

發送簡訊給我
#25 引用回覆 回覆 發表時間:2005-06-29 17:15:46 IP:218.25.xxx.xxx 未訂閱
cashxin2002 兄好 在此再次表示万分的感谢! 怪我没说清楚!"改用途备注"字段,是做个临时的备注字段.字段的格式可以是如下几种: "yy-mm-dd歇业"或"停业"或"0402"或什么也不填为空值,或任意其他的备注说明.格式不是固定的.(要是带歇业字眼的,格式是固定为"yy-mm-dd歇业"的) 我只是想在这个字段里取出带有"歇业"字眼的,并且是取出如"yy-mm-dd歇业"这样的格式里月份和日期,判断是否大于一个月?如果大于一个月,就把这条记录里的"改用途备注"字段清空. 如兄所说的我都试了,不行.总是提醒"标准表达式中数据类型不批配".的提示. (另外和"協議計租月份"这个字段没关系.它只是我用来试验的.我最终是想实现:当大于一个月的条件满足就把相应的那条记录里的"改用途备注"字段的内容清空.)
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#26 引用回覆 回覆 發表時間:2005-06-29 19:14:37 IP:202.62.xxx.xxx 未訂閱
您好﹗    先用如下的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

發送簡訊給我
#27 引用回覆 回覆 發表時間:2005-06-29 22:35:17 IP:218.25.xxx.xxx 未訂閱
引言: 您好﹗ 先用如下的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

發送簡訊給我
#28 引用回覆 回覆 發表時間:2005-06-30 08:55:42 IP:202.62.xxx.xxx 未訂閱
您好﹗    試試這樣﹕ 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

發送簡訊給我
#29 引用回覆 回覆 發表時間:2005-06-30 11:28:41 IP:218.25.xxx.xxx 未訂閱
cashxin2002兄好 还是不行,我想加这个条件和过滤带"歇业"的条件应该是一样的吧? 用子查询是否可以实现先过滤带"歇业"字眼的记录,然后在过滤后的记录里在寻找符合大于一个月的条件的记录吗? 兄真受累了.......
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#30 引用回覆 回覆 發表時間:2005-06-30 12:40:41 IP:202.62.xxx.xxx 未訂閱
您好﹗    您用子查詢的想法應可行﹐試試如下﹕ 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

發送簡訊給我
#31 引用回覆 回覆 發表時間:2005-07-12 20:01:32 IP:218.25.xxx.xxx 未訂閱
谢谢cashxin2002兄 万分感谢兄不辞辛苦的一次又一次的为我解答. 还是不行.最近我有事好久没有上网,不好意思.
[<<] [1] [2] [>>]
系統時間:2024-07-03 2:14:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!