还是求时间差的问题,上次出了点问题,请大家帮忙,谢谢!

oenpm 2008-09-11 08:58:54
一个求时间差的问题,要求得数为分钟
前提条件:按照时间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


这个问题上次解决过,但是我没有注意到时间排序的问题,运行时候出现了负数的出现,所以这次提上来,请高手帮忙,谢谢,非常感谢
...全文
97 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CN_SQL 2008-09-11
  • 打赏
  • 举报
回复
其实他的需求,随便找一个日期组合就得了,和F4没什么关系。
CN_SQL 2008-09-11
  • 打赏
  • 举报
回复

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处理这个挺简单
-狙击手- 2008-09-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fcuandy 的回复:]
我的浏览器有问题,
每次都要手工敲 code=SQL 还有 /code]
郁闷
[/Quote]


嘿嘿,让你不散分
水族杰纶 2008-09-11
  • 打赏
  • 举报
回复

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 @t

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 行)

dawugui 2008-09-11
  • 打赏
  • 举报
回复
CREATE TABLE tb(id INT, f1 VARCHAR(10),f2 VARCHAR(10),f3 VARCHAR(10),f4 VARCHAR(10))
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'
GO

select 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 tb

drop 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 行)
*/
fzcheng 2008-09-11
  • 打赏
  • 举报
回复

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)
fcuandy 2008-09-11
  • 打赏
  • 举报
回复
我的浏览器有问题,
每次都要手工敲 code=SQL 还有 /code]
郁闷
tianhuo_soft 2008-09-11
  • 打赏
  • 举报
回复
麻烦在 拼装字符串
fcuandy 2008-09-11
  • 打赏
  • 举报
回复

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'
GO

SELECT 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

CN_SQL 2008-09-11
  • 打赏
  • 举报
回复
不好意思哈,你把我的定义字段date和time,都改成datetime
Garnett_KG 2008-09-11
  • 打赏
  • 举报
回复


declare @t table(id int,f1 varchar(10),
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

CN_SQL 2008-09-11
  • 打赏
  • 举报
回复
如果你不确定F2,F1是谁大,但有需要得到一个正数的差,那你就取绝对值好了如:

select
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
CN_SQL 2008-09-11
  • 打赏
  • 举报
回复

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排序不排序无关啊,因为你的想减是同一行的,只要你保证你减数,大于被减数,就不会是负数
oenpm 2008-09-11
  • 打赏
  • 举报
回复
第二行的ID=3 而且 F2=2:23 F1=2:05 所以 F2-F1=17分钟

对不起,有个错误 ,对于原来的表中F4字段

id f1 f2 f3 f4
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
......
CN_SQL 2008-09-11
  • 打赏
  • 举报
回复
没看懂你的结果数据。
18,17怎么计算的。第2行

34,576

社区成员

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

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