有点复杂的一个sql语句,但对你来说可能很简单! 在线等待!

friendwei 2003-10-13 02:18:12
我的表中有以下数据:
----------------------------
kcode op_date
----------------------------
001 09-15
002 09-15
003 09-15
007 09-15
004 09-30
009 09-30
001 09-30
005 10-01
006 10-09
007 10-11


如果当天时间为 10-13 ,那么我想要得到以下结果,输入一个数字:

如果数字为2,则表示最近2天没有来的人有
kcode op_date
----------------------------
007 10-11


如果数字为13,则表示最近13天没有来的人有
kcode op_date
----------------------------
004 09-30
009 09-30
001 09-30

如果数字为27,则表示最近27天没有来的人有
kcode op_date
----------------------------
002 09-15
003 09-15


怎么写这个sql 呢???
...全文
68 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2003-10-14
  • 打赏
  • 举报
回复
--第二个convert的位置用错了,改为下面的就可以了:

select * from ktrade.dbo.ktrade_info
where convert(varchar(10),op_date,120)=convert(varchar(10),dateadd(day,-10, getdate()),120)
friendwei 2003-10-14
  • 打赏
  • 举报
回复
其中 op_date 为 datetime 类型,如 2003-10-01 14:38:14.000

这样写怎么查不出结果呢?
select * from ktrade.dbo.ktrade_info
where convert(varchar(10),op_date,120)=dateadd(day,-10,convert(varchar(10), getdate(),120))
friendwei 2003-10-14
  • 打赏
  • 举报
回复
谢谢 zjcxc(邹建)
快好了,但还有点要求,如:

kcode op_date(类型:datetime)
----------------------------
001 2003-10-01 14:38:14.000
001 2003-10-09 14:38:14.000
001 2003-10-12 23:23:23.123

如果输入的数字为 -2 则可以显示: 001 2003-10-12 23:23:23.123
这是正确的!

但输入的数字为 -17 时 就应该无法找到相应的记录了,因为 001 最后一次的记录时间是
2003-10-12 23:23:23.123,离当天的时间差是-2 而不是-17 ,你现在的办法却可以查到时间为2003-10-01 14:38:14.000 的记录了。

请再帮看看!谢!
maoyesky 2003-10-13
  • 打赏
  • 举报
回复
declare @day int
declare @t table (k_code varchar(3),op_date varchar(5))
insert @t values('001','09-15')
insert @t values('002','09-15')
insert @t values('003','09-15')
insert @t values('007','09-15')
insert @t values('001','09-30')
insert @t values('004','09-30')
insert @t values('009','09-30')
insert @t values('005','10-01')
insert @t values('006','10-09')
insert @t values('007','10-11')
set @day=2

select * from @t
where op_date=substring(convert(varchar(10),getdate() - @day,120),6,5)
yujohny 2003-10-13
  • 打赏
  • 举报
回复
测试例子都给出来了,楼主难度还没调试成功???
jingsg0 2003-10-13
  • 打赏
  • 举报
回复
create procedure test @a int
As
Select * from (Select kcode,max(op_date) as op_date from 表) aa
where datediff(day,cast(op_date as datetime),getdate())>= @a
go

orcale 2003-10-13
  • 打赏
  • 举报
回复
declare @day int
declare @t table (k_code varchar(3),op_date varchar(5))
insert @t values('001','09-15')
insert @t values('002','09-15')
insert @t values('003','09-15')
insert @t values('007','09-15')
insert @t values('001','09-30')
insert @t values('004','09-30')
insert @t values('009','09-30')
insert @t values('005','10-01')
insert @t values('006','10-09')
insert @t values('007','10-11')
set @day=28
select a.k_code,left(a.dt,5) as op_date from (select k_code,op_date+'-'+'03' as dt from @t)a where datediff(day,convert(datetime,a.dt,10),getdate()) <=@day

cxmvip 2003-10-13
  • 打赏
  • 举报
回复
select *
from @yourtablename
select datediff(day,convert(datetime,convert(char,year(getDate()))+op_date),getDate())<=@differenceday

其中:@yourtablename是你的表名
@differenceday是最近的几天
friendwei 2003-10-13
  • 打赏
  • 举报
回复
to 马可
按你的方法,遇到以下问题呢
Column 'ktrade.dbo.ktrade_info.client_bh' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
friendwei 2003-10-13
  • 打赏
  • 举报
回复
to cceo:
按你的方法试了,报错如下:
Syntax error converting datetime from character string.

另外,我op_date 日期都是如 2003-10-01 14:38:14 这样的数据
jkljf 2003-10-13
  • 打赏
  • 举报
回复
马可, 你这句话怎么要用from (Select kcode,max(op_date) as op_date from 表) aa ?
我觉得是直接引用表名阿
magnetmoon 2003-10-13
  • 打赏
  • 举报
回复
try:

declare @i int
set @i=2
select * from grd_det
where datediff(day,grd_jlrq,getdate())=@i
CCEO 2003-10-13
  • 打赏
  • 举报
回复
select * from tablename
where convert(datetime,'2003-'+op_date)=dateadd(day,-2,convert(char(8),getdate(),112))
txlicenhe 2003-10-13
  • 打赏
  • 举报
回复
create procedure test @a int
As
Select * from (Select kcode,max(op_date) as op_date from 表) aa
where datediff(day,cast(year(getdate()) as char(4)) + '-' + op_date,getdate())>= @a
go

-- 调用 Exec test 2
-- Exec test 27
txlicenhe 2003-10-13
  • 打赏
  • 举报
回复
declare @a int
set @a = 27
Select * from (Select kcode,max(op_date) as op_date from 表) aa
where datediff(day,cast(year(getdate()) as char(4)) + '-' + op_date,getdate())>= @a

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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