SQL SERVER里以时间为条件进行的查询(50分)

  • 主题发起人 主题发起人 jobsxy
  • 开始时间 开始时间
J

jobsxy

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说我需要统计出2002-01-01至2002-06-30内所有8:00-10:00的记录,应该如何写呢?

我曾这样写

Select * from table1
where (buytime between '2002-01-01' and '2002-06-30')
and (timevalue(buytime) between '8:00:00' and '10:00:00');

搞不定,后来又换成:

Select * from table1
where (Left(buytime,10) between '2002-01-01' and '2002-06-30')
and (Right(buytime,8) between '8:00:00' and '10:00:00');

也不行,发现是日期时间的格式不是这样的,所以不能成功。我也试了convert,可能是不会
用,总是报错。
 
我的做法是将库结构中的日期字段全部用字符串替代,以后就用formatdatetime统一格式
进行存储,这很方便.
 
如果buytime字段是DATETIME类型的话可以直接用 “2002-01-01 8:00:00”判断啊!
 
to windbell: 如果是用字符串替代,那无法比较两个日期的区间,而且统计日期相差天数时麻
烦太多了,:(

to players: 我查看了数据库表,存储的格式为:Apr 5 20 8:00PM,因为我是在别人的数据库
基础上做的进一步开发,所以不能修改数据库的任何信息。
 
我知道数据库里面是这么处理的!可你把可以用上面的方式比较啊!我刚试了啊
EG

select * from JHD WHERE DJSJ<='2002.2.3 8:00:00'

 
用字符串替代,若比较两个日期的区间或统计日期相差天数时只要用strtodatetime再转换
成datetime类型就可以了,这样可以不用考虑系统日期格式
 
to players:你所说的确实可以,不过我需要日期和时间分别处理,因为
“我需要统计出2002-01-01至2002-06-30内所有8:00-10:00的记录”,就
是这个原因让我十分的苦恼,:(
 
如果有时间就比较麻烦一点。
你可以用转换字符的方式。来是一下。
 
query1.sql.add('select * from tablename where regdate>:lastdate');
query1.parambyname('lastdate').asdatetime:=strtodate('2001-01-01');
query1.open;
 
如果这样就用一个临时表和一个QUERY联合查询!先在DELPHI中加入循环来去日期!然后在SQL
中去判断时间范围!
 
select T2.* from (select T1.* from Table
where T1.buytime between '2002-01-01' and '2002-06-30') as T2
where Right(convert(varchar(20),T2.buytime),8)='8:00:00'
 
怎么样?搞定了吧?
 
Select * from table1
where (buytime between '2002-01-01' and '2002-06-30')
and ((datepart(hh,buytime) between 8 and 9)
Or (datepart(hh,buytime)=10 and datepart(mi,buytime)=0 and datepart(ss,buytime)=0)

這樣很煩瑣,但能達到目的.


 
该不会完全不管执行时间吧!这样如果数据量大的话会非常慢的
 
select Convert(varchar(10),shippeddate,21) -->'yyyy-mm-dd'
select Convert(varchar(8),shippeddate,108) -->'hh:mm:ss'
 
关注,
希望看到执行效益高的写法。
 
select * from table1 where buytime between '2002-05-01' and '2002-05-30' and datepart(hh,buytime) between '8' and '10'
 
to jerryjean:你的办法只能统计出指定时间啊,可我需要一个时间范围,如从8点到10点
的所有记录,:(

看来只有smokingroom的办法可行了,难道就没有更好的吗?
 
代码:
for i=0 to n do
begin
  with query1 do
  begin
    close;
    sql.clear;
    sql.add( select * from table where time>1 and time<2 and date=3 )   
   ....
  end;  
end
 
唉players,还有没有更有效益的办法呢?!如果我的日期范围是30天,每天有10个时间段,
那就要执行300次的SQL,估计要把SQL SERVER搞废掉,若以smokingroom的办法,只需循环10
次,不过条件语句看起来不够优化,不知道真正的执行效率如何,也不敢去测试,因为还有
20几台POS机连着这个数据库,如果影响了POS的正常工作,老板非扁我不可,:(
 
后退
顶部