大家好,情况是这样的,用SQL Server的数据库,比如有3个列,分别为ID , DateTime ,Value ,ID表示设备的编号,DataTime是更新时间,Value是数值,
比如有这样的几行数据          01   2009-04-16 13:00:00     15.5
                          02   2009-04-16 13:20:00     17.6
                          03   2009-04-16 13:30:00     27.6
                          04   2009-04-16 14:10:00     16.6
                          05   2009-04-16 14:30:00     21.1
                          06   2009-04-16 14:45:00     16.6插入记录的时候插入了当时的时间的,在查询的时候,我现在用了两个Datetimepicker ,一个表示起始时间,一个表示结束时间,可以查询到这两个时间段之间的数据,但现在我想加入一个这样的筛选条件,就是记录间的DateTime相隔一定时间,比如是查询2009-04-16 13:00:00到2009-04-16 15:00:00时间间隔为半个小时的数据,因为有些是在半个小时内的数据就筛选掉
查询到得结果应该是: 
                          01   2009-04-16 13:00:00     15.5
                          03   2009-04-16 13:30:00     27.6
                          05   2009-04-16 14:30:00     21.1
因为我有时候如果查询区间很长的话,就会有很多记录,所以需要按照间隔时间筛选一些出来啊,不知用SQL语句是怎样查询呢?谢谢大家
                          

解决方案 »

  1.   

    所以需要按照间隔时间筛选一些出来啊 select top n(n>1) * from table order by DateTime
      

  2.   

    S := FormatDataTime('YYYY-MM-DD HH:MM',Datetimepicker.DATETIME);
    S1 := Copy(s,15,2);
    if S1=30 then showmessage(ok);
      

  3.   

    select * from table where substring(DateTime,15,2)= 30  
      

  4.   

    /*
    declare 
    @time varchar(18),
    @strTime varchar(2),@stime varchar(18)
    Set @time = '2009-04-19 14:20:23'
    print @stime
    set @strTime = Substring(@time,15,2) + 30  
    print @StrTime
    */--这里可以用存储过程或在DELPHI中处理.如果是DATIME型,还要CONVERT一下。SELECT * FROM table1 WHERE  substring(dttime,15,2) = @StrTime 
    你试一下。
    全部在SQL 分析器中通过
    表名为table1  字段为ID和DTTIME(字符形的)
      

  5.   

    @time为输入时间.@strTime为你要求的时间.
      

  6.   

    有个笨方法,可以试一下:
    先定义一个临时的时间变量C,你设置的起始时间A,结束时间为B
    然后换你的要求(比A大半个小时以上,但小于时间B)开始查询数据,将查得的第一条数据显示出来,并将该条数据的时间存到C
    然后再查比C大半小时以上,但小于B的数据,再将查得的数据显示出来,并时该数据的时间存给C;



    直到查不到结果为止。
    做个循环就行了,方法笨了点,但可以实现你的要求
      

  7.   

    你好,楼上楼上的方法不是很明白啊,不知可否说明下呢,我的datetime是时间类型的啊,这样的话是怎样转换呢,而楼上的方法不知能不能给出代码呢?谢谢大家,不是很明白,求助求助
      

  8.   

    DECLARE @STR VARCHAR(19) 
    SET @STR =CONVERT(VARCHAR(19), CURRENT_TIMESTAMP, 20) 
    PRINT @STR --DateTime转 STR 
    declare 
    @time varchar(18), 
    @strTime varchar(2),@stime varchar(18) 
    Set @time = '2009-04-19 14:20:23' 
    print @stime 
    set @strTime = Substring(@time,15,2) + 30  
    print @StrTime 
    --这里可以用存储过程或在DELPHI中处理.如果是DATIME型,还要CONVERT一下。 SELECT * FROM table1 WHERE  substring(CONVERT(VARCHAR(19),dttime,20),15,2) = @StrTime你在分析器中测试一下。 
    如果连续要查多个半小时的,将查出的结果做输入,可以用个循环,或者用游标。
    楼主多想想,你应该可以搞定的。
      

  9.   

    谢谢楼上的方法啊,但是好像很复杂哦,没有用过存储过程看得不是很明白啊,很多语句都不知道是什么意思啊,不知兄台可否给个delphi代码的方法呢?5555555555555555555555555555555555555555困扰了很久,万分感激,谢谢
      

  10.   

    不知道用下面的思路如何:
      假設用戶用Datetimepicker選擇的開始時間是T1,結束時間是T2:
      select * from table where 
          DateTime >= T1 and DateTime <= T2    --篩選出這個時間段的所有資料
           DateDiff('m',DateTime,T1) % 30 = 0   --時間差30分(兩個時間的相差的分鐘可以被30整除)的資料篩選出來
      order by DateTime如果DateTime上有索引的話,在查詢的時候將不會被用到,性能會比較差一點.我沒有裝MSSQL,請樓主測試一下是否可行!
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
     s,stime, stime1 :string;
    begin
     stime := formatDateTime('YYYY-MM-DD HH:MM:SS',self.DateTimePicker1.DateTime); sTime := IntToStr(StrToInt(Copy(stime,15,2)) + 30) ;
     if StrToInt(sTime) > 60 then begin
        sTime := IntToStr(StrToInt(sTime) - 60); //超过减60
        if Length(sTime) < 2 then STime := '0'+STime;//补足两位
     end; if StrToInt(stime) - 30 < 0 then
        stime1 := IntTOStr(StrToInt(stime)+ 30)
     else
        stime1 := IntTOStr(StrToInt(stime) - 30); //求另一个数值
     if Length(stime1) < 2 then sTime1 := '0'+stime1;
     s := 'SELECT * FROM table1 WHERE  substring(CONVERT(VARCHAR(19),dttime,20),15,2) =' + ''''+stime+'''';
     s := s + ' OR substring(CONVERT(VARCHAR(19),dttime,20),15,2) =' + ''''+stime1+'''';
     self.ADOQuery1.SQL.Text := s ;
     try
       self.ADOQuery1.Open;
     except end;
    end;
      

  12.   

    这样查询的话,除了00分和30分两个时段以为,其他的都查询不出来啊
    self.DateTimePicker1.DateTime,就是用来传值的。
    你把所有的值代入查就行了。时间段,WHERE 里面加个 AND DTTIME >= TIME1 AND DTTIME <=TIME2 就行了。这个问题,我回答到此了。不会要我完成所有的代码编写吧。不难的。这个问题。楼主
    还是多看看书,这个很基础的。否则,再变点条件,估计你又要提问了。
      

  13.   

    加个TIMER,每查一次,时间变量又更新,时间变量递值(A:=B,B:= B+30分,或INC加也行),再执行查询.TIMER里检半小时.跟数据关系不大吧
      

  14.   

    写个存储过程吧,然后用TIMER定时执行这个存储过程
    declare @a int
    declare @b intset @a = 31 --你定的分种数if (@a < 30) set @b = @a + 30
    else set @b = @a - 30select ID,DateTime,Value from ABC 
    where (substring(convert(varchar,删除日期),15,2) in (convert(varchar,@a),convert(varchar,@b)))
    and (DateTime beetwin 'yourtimeA' and 'yourtimeB')
      

  15.   

    我认为像17楼那样写好,只不过这位大侠表述的不够精确,应改为
      select * from yourtable where 
         ( (yourDateTime >= T1) 
           and (yourDateTime <= T2) 
           and  (DateDiff('mi',t1,yourdatetime) % 30 = 0) )
      order by yourDateTime 
    试试吧
      

  16.   

    忙中出错,现改为 
      select * from yourtable where 
        ( (yourDateTime >= T1) 
          and (yourDateTime <= T2) 
          and  (DateDiff(minute,t1,yourdatetime) % 30 =datepart(minute,yourdatetime)) ) 
      order by yourDateTime 
      

  17.   

    早晨醒来发现没有这么简单,现改为
      select * from yourtable 
        where 
        (      (yourDateTime >= T1) 
          and  (yourDateTime <= T2) 
          and  (Datepart(minute,t1) =datepart(minute,yourdatetime)% 30 ) 
          and  (Datepart(second,t1)=Datepart(second,yourdatetime))
          and  (datepart(millisecond,t1)=Datepart(millisecond,yourdatetime))
        ) 
      order by yourDateTime 后面的秒和毫秒条件可以随你想要精确的程度而增减