根据时间查询数据的问题?

HardlyStudy 2009-12-08 07:01:32
表1如下:

ID Date Date1 Date2 Date3
1 2009-11-01 2009-11-01 2009-11-02 2009-11-01
2 2009-11-01 2009-11-02 2009-11-01 2009-11-01
3 2009-11-01 2009-11-01 2009-11-01 2009-11-01
4 2009-11-01 2009-11-01 2009-11-01 2009-11-02
5 2009-10-26 2009-11-01 2009-10-26 2009-11-01
6 2009-10-28 2009-10-28 2009-10-31 2009-10-28

原本表里面的Date,Date1,Date2,Date3四个日期是一样的,因为某些内容作了更新,所以Date1,Date2,Date3某个或者某几个会做出相应的更新,变为更新数据当日的时间。所以该条数据有没有被更新过,是根据Date1,Date2,Date3三个日期是否和Date日期完全相同来确定的。

现在要求如下,根据运行该查询语句的日期时间来查询有变更的数据:
1.如果运行该查询语句的日期时间是周二至周六其中的一天,查询出前一天的变更的数据;
2.如果运行该查询语句的日期时间是周一,查询出前面两天(星期六和星期日)变更的数据;

上面的测试数据,我在2009-11-03运行该查询时,因为2009-11-03是周二,所以它会查询出前一天变更了的数据,运行的结果应该为:
ID Date Date1 Date2 Date3
1 2009-11-01 2009-11-01 2009-11-02 2009-11-01
2 2009-11-01 2009-11-02 2009-11-01 2009-11-01
4 2009-11-01 2009-11-01 2009-11-01 2009-11-02

我在2009-11-02运行该查询时,因为2009-11-02是周一,所以要查询出前两天,即2009-10-31和2009-11-01发生过变更的数据,结果应该为:
ID Date Date1 Date2 Date3
5 2009-10-26 2009-11-01 2009-10-26 2009-11-01
6 2009-10-28 2009-10-28 2009-10-31 2009-10-28

这样的查询应该如何实现?请高手赐教,不胜感激!
...全文
168 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
HardlyStudy 2010-01-22
  • 打赏
  • 举报
回复
很经典的题目,需要多温习才不会忘记
HardlyStudy 2009-12-15
  • 打赏
  • 举报
回复
谢谢大家!
yaj52125 2009-12-14
  • 打赏
  • 举报
回复
up
HardlyStudy 2009-12-14
  • 打赏
  • 举报
回复
3楼的确实不错!大赞!!!
nianran520 2009-12-10
  • 打赏
  • 举报
回复
3楼不行?
HardlyStudy 2009-12-10
  • 打赏
  • 举报
回复
顶上去继续问!
ACMAIN_CHM 2009-12-09
  • 打赏
  • 举报
回复
[Quote]这就要看你是哪天进行查询的了,如果是2009-11-02、2009-11-12去查询的话,这条数据都将作为结果被查询出来。2009-11-22是星期日,不会进行查询,要2009-11-23星期一去查询的话,也会查到这条数据。[/Quote]

也就是记录中任何一个日期,符合条件则选出。
HardlyStudy 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 acmain_chm 的回复:]
3      2009-11-01    2009-11-02    2009-11-11    2009-11-21

这个算哪天更新的呢?
[/Quote]

这就要看你是哪天进行查询的了,如果是2009-11-02、2009-11-12去查询的话,这条数据都将作为结果被查询出来。2009-11-22是星期日,不会进行查询,要2009-11-23星期一去查询的话,也会查到这条数据。
HardlyStudy 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chinajiabing 的回复:]
SQL codedeclare@tbtable (idint,datedatetime,date1datetime,date2datetime,date3datetime)insertinto@tbselect1,'2009-11-01','2009-11-1','2009-11-02','2009-11-01'unionallselect2,'2009-11-01','2009-11-2','2?-
[/Quote]

这个看不出在哪里判断当前日期是星期几了?
HardlyStudy 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 acmain_chm 的回复:]
引用这就要看你是哪天进行查询的了,如果是2009-11-02、2009-11-12去查询的话,这条数据都将作为结果被查询出来。2009-11-22是星期日,不会进行查询,要2009-11-23星期一去查询的话,也会查到这条数据。

也就是记录中任何一个日期,符合条件则选出。
[/Quote]

是的。
yl259443 2009-12-08
  • 打赏
  • 举报
回复
declare @table table([ID] int,[Date] varchar(10),[Date1] varchar(10),[Date2] varchar(10),[Date3] varchar(10))
insert @table
select 1,'2009-11-01','2009-11-01','2009-11-02','2009-11-01' union all
select 2,'2009-11-01','2009-11-02','2009-11-01','2009-11-01' union all
select 3,'2009-11-01','2009-11-01','2009-11-01','2009-11-01' union all
select 4,'2009-11-01','2009-11-01','2009-11-01','2009-11-02' union all
select 5,'2009-10-26','2009-11-01','2009-10-26','2009-11-01' union all
select 6,'2009-10-28','2009-10-28','2009-10-31','2009-10-28'


select *
from @table
where ((datepart(dw,getdate()) between 3 and 7) and (
(date1<>date and DATEDIFF(day, cast(date1 as datetime), getdate())=1) or
(date2<>date and DATEDIFF(day, cast(date2 as datetime), getdate())=1) or
(date3<>date and DATEDIFF(day, cast(date3 as datetime), getdate())=1)))
or
((datepart(dw,getdate()) between 1 and 2) and (
(date1<>date and DATEDIFF(day, cast(date1 as datetime), getdate())in(1,2)) or
(date2<>date and DATEDIFF(day, cast(date2 as datetime), getdate())in(1,2)) or
(date3<>date and DATEDIFF(day, cast(date3 as datetime), getdate())in(1,2))))
ACMAIN_CHM 2009-12-08
  • 打赏
  • 举报
回复
3 2009-11-01 2009-11-02 2009-11-11 2009-11-21

这个算哪天更新的呢?
linguojin11 2009-12-08
  • 打赏
  • 举报
回复
后面的我觉得可以借助字符查找语句使用
charindex(','+dateadd(dd,-1,@dt)+',',','+date1+','+date2+','+date3+',')>0,关键点在于判断是星期几 呵呵
donghaiting1256 2009-12-08
  • 打赏
  • 举报
回复
这个程序的关键应该是查询条件的给出,即如何判断是周几,从而得出查询的时间段。而一旦知道查询条件,SQL语句就很好写了。
查询条件的给出建议使用C或者是Java给出,一般不要用SQL语句写比较复杂的算法
ChinaJiaBing 2009-12-08
  • 打赏
  • 举报
回复


declare @tb table (id int,date datetime,date1 datetime,date2 datetime,date3 datetime)
insert into @tb select 1,'2009-11-01','2009-11-1','2009-11-02','2009-11-01'
union all select 2,'2009-11-01','2009-11-2','2009-11-01','2009-11-01'
union all select 3,'2009-11-01','2009-11-1','2009-11-01','2009-11-01'
union all select 4,'2009-11-01','2009-11-2','2009-11-01','2009-11-02'
union all select 5,'2009-10-26','2009-11-1','2009-10-26','2009-11-01'
union all select 6,'2009-10-28','2009-10-28','2009-10-31','2009-10-28'
select * from @tb a where
not exists(select 1 from @tb where a.date=date and a.date=date1 and a.date=date2 and a.date=date3)


/*


(6 行受影响)
id date date1 date2 date3
----------- ----------------------- ----------------------- ----------------------- -----------------------
5 2009-10-26 00:00:00.000 2009-11-01 00:00:00.000 2009-10-26 00:00:00.000 2009-11-01 00:00:00.000
6 2009-10-28 00:00:00.000 2009-10-28 00:00:00.000 2009-10-31 00:00:00.000 2009-10-28 00:00:00.000

(2 行受影响)


*/
nianran520 2009-12-08
  • 打赏
  • 举报
回复
--> 测试数据:@table
declare @table table([ID] int,[Date] varchar(10),[Date1] varchar(10),[Date2] varchar(10),[Date3] varchar(10))
insert @table
select 1,'2009-11-01','2009-11-01','2009-11-02','2009-11-01' union all
select 2,'2009-11-01','2009-11-02','2009-11-01','2009-11-01' union all
select 3,'2009-11-01','2009-11-01','2009-11-01','2009-11-01' union all
select 4,'2009-11-01','2009-11-01','2009-11-01','2009-11-02' union all
select 5,'2009-10-26','2009-11-01','2009-10-26','2009-11-01' union all
select 6,'2009-10-28','2009-10-28','2009-10-31','2009-10-28'

declare @search varchar(10)
select @search = '2009-11-02'
select * from @table
where ((cast([Date1] as datetime) >= case when datepart(weekday,@search)=2 then dateadd(day,-2,@search)
else dateadd(day,-1,@search) end and cast([Date1] as datetime) <= dateadd(day,-1,@search))
or (cast([Date2] as datetime) >= case when datepart(weekday,@search)=2 then dateadd(day,-2,@search)
else dateadd(day,-1,@search) end and cast([Date2] as datetime) <= dateadd(day,-1,@search))
or (cast([Date3] as datetime) >= case when datepart(weekday,@search)=2 then dateadd(day,-2,@search)
else dateadd(day,-1,@search) end and cast([Date3] as datetime) <= dateadd(day,-1,@search))
)
and cast([Date] as datetime) <> dateadd(day,-1,@search)
--结果
-----------------------------------
5 2009-10-26 2009-11-01 2009-10-26 2009-11-01
6 2009-10-28 2009-10-28 2009-10-31 2009-10-28
HardlyStudy 2009-12-08
  • 打赏
  • 举报
回复
谢谢楼上热心……
duanzhi1984 2009-12-08
  • 打赏
  • 举报
回复
这么多。。。
绑顶下吧

34,588

社区成员

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

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