大家好,情况是这样的,用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语句是怎样查询呢?谢谢大家
比如有这样的几行数据 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语句是怎样查询呢?谢谢大家
解决方案 »
- 新手问题,速来抢分
- 如何将程序分为界面exe和逻辑控制dll的形势,非数据库编程
- 求<<Delphi串口通信技术与工程实践>>电子书
- 鲨鱼请教:关于局域网的客户端的UDP访问公网的服务器,为什么客户端的端口每次都不一样?
- 如何让fastreport3中的条形码码值能带字母?急急急!!在线等……
- --- >高分求解超难问题!!关于窗口显示!!
- 能不能改成不用“元、角、分”呀?(100分等着你,在线等待)
- 各位大虾,关于delphi控制modem串口通信的问题,求救阿!!!
- 哪位朋友有ICONCOOL或ICONBOOK的注册码?或给我提供一些别的好的图标集。
- 大家好,我现在又有一个新的问题。我以100分为谢(我最高还只能给100)
- 加背景图片
- delphi socks5 udp 编程,有这方面经验的朋友帮下忙!!!
S1 := Copy(s,15,2);
if S1=30 then showmessage(ok);
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(字符形的)
先定义一个临时的时间变量C,你设置的起始时间A,结束时间为B
然后换你的要求(比A大半个小时以上,但小于时间B)开始查询数据,将查得的第一条数据显示出来,并将该条数据的时间存到C
然后再查比C大半小时以上,但小于B的数据,再将查得的数据显示出来,并时该数据的时间存给C;
。
。
。
直到查不到结果为止。
做个循环就行了,方法笨了点,但可以实现你的要求
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你在分析器中测试一下。
如果连续要查多个半小时的,将查出的结果做输入,可以用个循环,或者用游标。
楼主多想想,你应该可以搞定的。
假設用戶用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,請樓主測試一下是否可行!
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;
self.DateTimePicker1.DateTime,就是用来传值的。
你把所有的值代入查就行了。时间段,WHERE 里面加个 AND DTTIME >= TIME1 AND DTTIME <=TIME2 就行了。这个问题,我回答到此了。不会要我完成所有的代码编写吧。不难的。这个问题。楼主
还是多看看书,这个很基础的。否则,再变点条件,估计你又要提问了。
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')
select * from yourtable where
( (yourDateTime >= T1)
and (yourDateTime <= T2)
and (DateDiff('mi',t1,yourdatetime) % 30 = 0) )
order by yourDateTime
试试吧
select * from yourtable where
( (yourDateTime >= T1)
and (yourDateTime <= T2)
and (DateDiff(minute,t1,yourdatetime) % 30 =datepart(minute,yourdatetime)) )
order by yourDateTime
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 后面的秒和毫秒条件可以随你想要精确的程度而增减