100高分求一条sql语句,急!

steven_liuj 2006-07-24 06:19:01
用户表1中有用户号userid、设备类型名type、检验日期chkdate等字段
类型表2中有设备类型名typename、检验周期chkperiod等字段
关系检验日期+检验周期=待检日期
现想指定一个日期curdate,然后把用户表中凡是到了或者过了待检日期的用户号和设备名都列出来
本人sql有点弱,还望大家出出点子,谢谢

补充一点:检验日期和待检日期都是日期类型的例如2006-7-24,而检验周期是几年的形式,例如5年,注意不是5。
...全文
626 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuhuabucai 2006-07-26
  • 打赏
  • 举报
回复
收获很多!
十一月猪 2006-07-25
  • 打赏
  • 举报
回复
:-)
wwh999 2006-07-25
  • 打赏
  • 举报
回复
这主要针对你在开发时,选用什么样的数据库了。
1>不同的数据库类型,如ACCESS和SQL,其中内置的一些处理函数是有所差异的。你需要做针对性的修改。如查询数值,在VB+ACCESS中,用INSTR函数,而在SQL中,需要使用Patindex或Charindex..

2>加数据源判定?
-------------------------
没有这个必要,因为几乎没可能的你程序即要连ACCESS,又要使用SQL吧?同时使用两者作为数据库?
你只要做到把业务逻辑作好,以后根据这个逻辑的功能,对ACCESS/SQL做针对性的函数修改就成了。无论是ACCESS/SQL,在VB中,都是向它们发送SQL语句而已。
steven_liuj 2006-07-25
  • 打赏
  • 举报
回复
还是网络上高手多阿,问题终于解决了。
非常感谢楼上的兄弟在百忙之中给我答案,另一个帖子我已经给分了,但是这里还想再问一个问题,
针对Access数据源DATEADD('yyyy',b.chkperiod,a.chkdate)有效
针对sqlserver数据源DATEADD(yyyy,b.chkperiod,a.chkdate)有效
二者又不能兼容,那么程序中一定要加个数据源判定才能解决问题么?
有否共用的解决办法???

感谢
wwh999 2006-07-25
  • 打赏
  • 举报
回复
呵呵...汗一个。等着用的话,可得不知道猴年马月的了..!

手头有两个小项目在写,客户有点催...现在每天都少有时间上这儿来啊..
昵称被占用了 2006-07-25
  • 打赏
  • 举报
回复
印钞机V2.0
开发完没有,等着用呢

要不1.0的能用先用吧,呵呵
昵称被占用了 2006-07-25
  • 打赏
  • 举报
回复
改了应该没问题了

select a.userid, a.type, a.chkdate,DATEADD(yyyy,b.chkperiod,a.chkdate) as mustcheckdate
from customer a inner join type b on a.type=b.type where ( DATEADD(yyyy,b.chkperiod,a.chkdate) < ? )

wwh999 2006-07-25
  • 打赏
  • 举报
回复
上面都已经说得很清楚了啊...

DATEADD(yyyy,b.chkperiod,a.chkdate) 这样的写法没有问题,
看看是否B.chkperiold是否包含非数字...,DATEADD中的参数必须符合类型。
打个比方,如果你的表字段B.chkperiod中含有非数字字符,那么就会出错。
steven_liuj 2006-07-25
  • 打赏
  • 举报
回复
另外chkperiod列内容和类型已经改了,整数型,不存在空,都是0,1,2,3……
steven_liuj 2006-07-25
  • 打赏
  • 举报
回复
回楼上:
?在vb数据环境设计器中起到一个输入指定参数的作用

select a.userid, a.type, a.chkdate from customer a inner join type b on a.type=b.type where ( DATEADD(yyyy,b.chkperiod,a.chkdate) < ? )

上面的语句我在数据源为access是无法调试通过,如上,但是我又测试了一下sqlserver的数据源,是可行的,但是加上dateadd函数如下,却又不行了

select a.userid, a.type, a.chkdate,DATEADD(yyyy,b.chkperiod,a.chkdate) from customer a inner join type b on a.type=b.type where ( DATEADD(yyyy,b.chkperiod,a.chkdate) < ? )

不知道是怎么回事?问题出在哪里了
昵称被占用了 2006-07-25
  • 打赏
  • 举报
回复
问题还不是很清楚
最好列出
select distinct chkperiod from 类型表B
的结果

会不会
chkperiod
---------------
2年
3年

未設
8月
32月
。。。


wwh999 2006-07-25
  • 打赏
  • 举报
回复
上面的DATEADD(yyyy,b.chkperiod,a.chkdate) 这样的写法应该是没有问题,看看是否B.chkperiold是否包含非数字...
(DATEADD(yyyy,b.chkperiod,a.chkdate) < ? ....是什么意思?查询中不能有<?类型.
子陌红尘 2006-07-24
  • 打赏
  • 举报
回复
Access不支持DateAdd()函数的参数格式,查一下Access的帮助。
steven_liuj 2006-07-24
  • 打赏
  • 举报
回复
谢谢楼上的各位,我是在vb数据设计器中写出下列语句
select a.userid, a.type, a.chkdate,DATEADD(yyyy,b.chkperiod,a.chkdate) from customer a inner join type b on a.type=b.type where ( DATEADD(yyyy,b.chkperiod,a.chkdate) < ? )
但是在vb数据设计器中,始终报出如下错误:
[ODBC :Microsoft Access]参数不正确,需求2。

实在是不理解,还望大家出出点子,谢谢
wwh999 2006-07-24
  • 打赏
  • 举报
回复
還有你的chkperiod列,竟然不是數值型的嗎?.....如果是字符型,將很難參與計算的..,你把我上面的貼,復制到查詢分析器中執行一下看看.

chkperiod
---------------
2年
3年
未設
...?

2年,3年,能和數值項相加嗎?..你的chkperiod..列,是數據的才好計算.可以把Null值當作未設.
這樣?
----------------------------------------------------------------------------------

SELECT userID 用户ID,Type 设备,Chkdate 检验日期,待检日期=DATEADD(yy,B.chkperiod,chkdate)
FROM 用户表 A
INNER JOIN (
SELECT * FROM 类型表 WHERE Chkperiod IS NOT NULL
) B
ON A.type=B.typename
WHERE DATEADD(yy,B.chkperiod,chkdate) <= '2006-7-24'
wwh999 2006-07-24
  • 打赏
  • 举报
回复
空或者未定,該如何操作? 不予理會嗎?
wwh999 2006-07-24
  • 打赏
  • 举报
回复
if exists(select * from sysobjects where name='用户表' and xtype='U') drop table 用户表
if exists(select * from sysobjects where name='类型表' and xtype='U') drop table 类型表
GO
--生成测试用数据,为SELECT初始环境
CREATE TABLE 用户表(UserId Varchar(10),Type varchar(10),Chkdate datetime)
INSERT INTO 用户表 SELECT '001','T1','2006-7-7'
UNION ALL SELECT '002','T2','2005-6-5'
UNION ALL SELECT '003','T1','2004-2-25'

CREATE TABLE 类型表(Typename varchar(10),Chkperiod int)
INSERT INTO 类型表 SELECT 'T1',2
UNION ALL SELECT 'T2',3

select * from 用户表
select * from 类型表
GO
--此处为用来查询的SELECT语句


SELECT userID 用户ID,Type 设备,Chkdate 检验日期,待检日期=DATEADD(yy,B.chkperiod,chkdate)
FROM 用户表 A INNER JOIN 类型表 B ON A.type=B.typename
WHERE DATEADD(yy,B.chkperiod,chkdate) <= '2006-7-24'

GO
--删除测试散数据
DROP TABLE 用户表,类型表

/* -- 结果 --
用户ID 设备 检验日期 待检日期
---------- ---------- ------------------------------------------------------ ------------------------------------------------------
003 T1 2004-02-25 00:00:00.000 2006-02-25 00:00:00.000
*/ -- 完成 --
steven_liuj 2006-07-24
  • 打赏
  • 举报
回复
哦,重要补充,类型表B中检验周期chkperiod字段可能为空或者内容为‘未定’,那么这种语句想完美一点怎么写?未给出周期的视为不必送检的。
steven_liuj 2006-07-24
  • 打赏
  • 举报
回复
用户表A如下
userid type chkdate 理论待检日期
001 T1 2006-7-7 2008-7-7
002 T2 2005-6-5 2008-6-5
003 T1 2004-2-25 2006-2-25
.....

类型表B如下
typename chkperiod
T1 2年
T2 3年


要检索到今天2006-7-24为止需要送检的所使用用户名单和对应设备
结果因为下列记录集
用户号 设备 检验日期 待检日期
003 T1 2004-2-25 2006-2-25

以上范例供高手参考
zjcxc 2006-07-24
  • 打赏
  • 举报
回复
DECLARE @curdate datetime
SET @curdate = GETDATE()

SELECT *
FROM 用户表1 A, 类型表2 B
WHERE A.设备类型名type = B.设备类型名typename
AND DATEADD(year, CAST(B.检验周期chkperiod as int), A.检验日期chkdate) <= @curdate
加载更多回复(2)

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧