一个求时间差的问题,要求得数为分钟
前提条件:按照时间F4进行排序后进行计算例如 表t1 id f1 f2 f3 f4
1 1:10 1:20 1:30 2008-1-3
2 4:20 6:18 9:25 2008-1-4
3 2:05 2:23 2:40 2008-1-5
...... 用一条SQL语句进行查询 结果如下 id f4 f2-f1 f3-f2
1 2008-1-3 10 10
3 2008-1-4 18 17
2 2008-1-5 118 187
这个问题上次解决过,但是我没有注意到时间排序的问题,运行时候出现了负数的出现,所以这次提上来,请高手帮忙,谢谢,非常感谢
前提条件:按照时间F4进行排序后进行计算例如 表t1 id f1 f2 f3 f4
1 1:10 1:20 1:30 2008-1-3
2 4:20 6:18 9:25 2008-1-4
3 2:05 2:23 2:40 2008-1-5
...... 用一条SQL语句进行查询 结果如下 id f4 f2-f1 f3-f2
1 2008-1-3 10 10
3 2008-1-4 18 17
2 2008-1-5 118 187
这个问题上次解决过,但是我没有注意到时间排序的问题,运行时候出现了负数的出现,所以这次提上来,请高手帮忙,谢谢,非常感谢
解决方案 »
- 两表之间的操作???
- sql server 2000查询分析器连不上本地服务器
- SQL 查询语句的问题
- 再求一个语句完成下面的要求。小弟菜鸟!
- sql 语句错误 , 实现 wu1 ,wu2 ...
- 如何让grid控件中的数据来源于两个或多个数据库
- 能不能用一句sql实现我用下面这个罗嗦的方法实现的功能?其实就是字符串的累加
- 如何得到当前局域网中正在运行的所有的数据库(currently active server)的列表?请注意,不是active databse
- Sql server2000企业版和个人版的问题。
- 我该如何做?
- SQL 语句有没有类似 sleep(1000) 这样的暂停语句
- 循环合并一条记录的字符串,ITEM表中有100个列,如何将这一百个列内的字符串合并成一个字符串,中间的","隔开.
1 1:10 1:20 1:30 2008-1-3
2 4:20 6:18 9:25 2008-1-5
3 2:05 2:23 2:40 2008-1-4
......
declare @t1 table
(
id int identity(1,1),
f1 time,
f2 time,
f3 time,
f4 date
)insert @t1 select '1:10','1:20','1:30','2008-1-3'
union all select '4:20','6:18','9:25','2008-1-5'
union all select '2:05','2:23','2:40','2008-1-4'select
id,
f4,
[f2-f1] = datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f1,120)
,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)),
[f3-f2] = datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)
,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f3,120))
from @t1
order by f4和你的F4排序不排序无关啊,因为你的想减是同一行的,只要你保证你减数,大于被减数,就不会是负数
id,
f4,
[f2-f1] = abs(datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)
,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f1,120))),
[f3-f2] = abs(datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f3,120)
,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)))
from @t1
order by f4
f2 varchar(10),f3 varchar(10),f4 datetime
)
insert into @t select
1, '1:10', '1:20' , '1:30', '2008-1-3'
union all select
2, '4:20' , '6:18' , '9:25' , '2008-1-5'
union all select
3, '2:05' , '2:23' , '2:40' , '2008-1-4'select id,DATEDIFF(mi,f4+' '+f1,f4+' '+f2) as [f2-f1],
DATEDIFF (mi,f4+' '+f2,f4+' '+f3) as [f3-f2],
f4
from @t
order by f4
CREATE TABLE t1(id INT, f1 VARCHAR(10),f2 VARCHAR(10),f3 VARCHAR(10),f4 VARCHAR(10))
GO
INSERT t1 SELECT 1 ,'1:10', '1:20' , '1:30' , '2008-1-3'
UNION ALL SELECT 2 , '4:20' , '6:18' , '9:25' , '2008-1-5'
UNION ALL SELECT 3, '2:05' , '2:23', '2:40', '2008-1-4'
GOSELECT id,f4,
[f2-f1]=DATEDIFF(mi, f4 + ' ' + f1 + ':00.000',f4 + ' ' + f2 + ':00.000'),
[f3-f2]=DATEDIFF(mi, f4 + ' ' + f2 + ':00.000',f4 + ' ' + f3 + ':00.000')
FROM t1
GO
/*
1 2008-1-3 10 10
2 2008-1-5 118 187
3 2008-1-4 18 17*/DROP TABLE t1
GO
每次都要手工敲 code=SQL 还有 /code]
郁闷
DECLARE @t TABLE(id INT,f1 NVARCHAR(5),f2 NVARCHAR(5),f3 NVARCHAR(5),f4 DATETIME)
INSERT INTO @t
SELECT 1,'1:10','1:20','1:30','2008-1-3 ' UNION ALL
SELECT 2,'4:20','6:18','9:25',' 2008-1-4 ' UNION ALL
SELECT 3,'2:05','2:23','2:40',' 2008-1-5 'SELECT id,f4,(LEFT(f2,LEN(f2)-3)*60+RIGHT(f2,2))-(LEFT(f1,LEN(f1)-3)*60+RIGHT(f1,2))AS 'f2-f1',
(LEFT(f3,LEN(f3)-3)*60+RIGHT(f3,2))-(LEFT(f2,LEN(f2)-3)*60+RIGHT(f2,2))AS 'f3-f2'
FROM @t
ORDER BY f4(3 row(s) affected)id f4 f2-f1 f3-f2
----------- ------------------------------------------------------ ----------- -----------
1 2008-01-03 00:00:00.000 10 10
2 2008-01-04 00:00:00.000 118 187
3 2008-01-05 00:00:00.000 18 17(3 row(s) affected)
INSERT tb SELECT 1 , '1:10' , '1:20' , '1:30' , '2008-1-3'
UNION ALL SELECT 2 , '4:20' , '6:18' , '9:25' , '2008-1-5'
UNION ALL SELECT 3 , '2:05' , '2:23' , '2:40' , '2008-1-4'
GOselect id , f4,
'f2-f1' = datediff(mi,cast(f4+' '+f1+':00' as datetime),cast(f4+' '+f2+':00' as datetime)),
'f3-f2' = datediff(mi,cast(f4+' '+f2+':00' as datetime),cast(f4+' '+f3+':00' as datetime))
from tbdrop table tb/*
id f4 f2-f1 f3-f2
----------- ---------- ----------- -----------
1 2008-1-3 10 10
2 2008-1-5 118 187
3 2008-1-4 18 17(所影响的行数为 3 行)
*/
declare @t table(id int,f1 varchar(10),f2 varchar(10),f3 varchar(10),f4 varchar(10))
insert @t select 1, '1:10', '1:20', '1:30' , '2008-1-3'
insert @t select 2, '4:20', '6:18', '9:25' , '2008-1-5'
insert @t select 3, '2:05', '2:23', '2:40' , '2008-1-4'
--select id,f4,datediff(f4+' '+f2)
select ID,F4,
datediff(mi,convert( varchar(20),f4+' '+f1,120),convert( varchar(20),f4+' '+f2,120))[F2-F1],
datediff(mi,convert( varchar(20),f4+' '+f2,120),convert( varchar(20),f4+' '+f3,120))[F3-F2]
from @tID F4 F2-F1 F3-F2
----------- ---------- ----------- -----------
1 2008-1-3 10 10
2 2008-1-5 118 187
3 2008-1-4 18 17(所影响的行数为 3 行)
declare @t1 table
(
id int identity(1,1),
f1 time,
f2 time,
f3 time,
f4 date
)insert @t1 select '1:10','1:20','1:30','2008-1-3'
union all select '4:20','6:18','9:25','2008-1-5'
union all select '2:05','2:23','2:40','2008-1-4'select
id,
f4,
[f2-f1] = datediff(minute,f1,f2),
[f3-f2] = datediff(minute,f2,f3)
from @t1
order by f4楼下的谁帮测试一下,2005和2000下,如果时间字段定义成DATETIME,直接DATEDIFF是什么结果。
刚测试了一下,才发现2008处理这个挺简单