datagridview 上下行计算

yanzhihong2014 2011-11-17 03:30:21
数据库表如下:
ID 姓名 时间
1 张三 2011/8/18 15:47
2 李四 2011/8/19 19:47
3 王五 2011/8/20 15:47
4 麻子 2011/8/21 15:27

我想用datagridview绑定后达到以下效果:
ID 姓名 时间 处理时间
1 张三 2011/8/18 15:47
2 李四 2011/8/19 19:47 1天4小时
3 王五 2011/8/20 20:47 1天1小时
4 麻子 2011/8/21 22:47 1天2小时

也就是下一行时间减去上一行的时间得出处理的时间,并用datagridview绑定出来,该如何做呢,请赐教
...全文
142 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
苦苦的潜行者 2011-11-18
  • 打赏
  • 举报
回复
use test
go
if object_id('t1') is not null
drop table t1
go
create table t1 (id int,[姓名] varchar(10),[时间] datetime )
go
insert t1
select 1,'张三' ,'2011-08-18 15:47' union all
select 2,'李四' ,'2011-08-19 19:47' union all
select 3,'王五' ,'2011-08-20 20:47' union all
select 4,'麻子' ,'2011-08-21 22:47'

go

select o.*,[处理时间]=isnull(u.[处理时间],'') from t1 as o
left join
(select a.id,
cast(datediff(hh,b.[时间],a.[时间]) /24 as varchar) +'天'+
cast(datediff(hh,b.[时间],a.[时间]) %24 as varchar) +'小时' as [处理时间]
from t1 a,t1 b
where a.id-b.id=1 and a.id>1) as u
on o.id=u.id
/*
(所影响的行数为 4 行)
id 姓名 时间 处理时间
--- --- --- --------
1 张三 2011-08-18 15:47:00.000
2 李四 2011-08-19 19:47:00.000 1天4小时
3 王五 2011-08-20 20:47:00.000 1天1小时
4 麻子 2011-08-21 22:47:00.000 1天2小时

*/
go
drop table t1


查询出来的记录集跟dategridview绑定即可.
yanzhihong2014 2011-11-18
  • 打赏
  • 举报
回复
还有如果表是这样的:
ID 姓名 时间
1 张三 2011/8/18 15:47
2 李四 2011/8/19 19:47
6 王五 2011/8/20 15:47
7 麻子 2011/8/21 15:27

统计就会达不到那种效果
yanzhihong2014 2011-11-18
  • 打赏
  • 举报
回复
根据qgqch2008的方法改成了mysql的,代码如下:
CREATE TABLE TB (id INT not null AUTO_INCREMENT primary key ,name_ VARCHAR(20),time VARCHAR(20))
ENGINE=MyISAM DEFAULT CHARSET=gbk;
INSERT INTO TB (name_,time) VALUES('张三', '2011/8/18 15:47');
INSERT INTO TB (name_,time) VALUES( '李四', '2011/8/19 19:47');
INSERT INTO TB (name_,time) VALUES('王五', '2011/8/20 20:47');
INSERT INTO TB (name_,time) VALUES('麻子', '2011/8/21 22:27');

SELECT a.* ,IFNULL(CONCAT(LTRIM(DATEDIFF(a.time, b.time) ) , '天', LTRIM(HOUR(TIMEDIFF(a.time,b.time)) mod 24), '小時' ,LTRIM(MINUTE(TIMEDIFF(a.time,b.time)) ), '分钟' ),'') AS '處理時間'
FROM TB a
LEFT JOIN TB b ON a.id = b.id + 1

但是目前想改成这样的效果:

ID 姓名 时间 处理时间
1 张三 2011/8/18 15:47 1天4小时
2 李四 2011/8/19 19:47 1天1小时
3 王五 2011/8/20 20:47 1天2小时
4 麻子 2011/8/21 22:47

如何实现
木木 2011-11-17
  • 打赏
  • 举报
回复
在取数据数据的时候计算吧,
DENQH 2011-11-17
  • 打赏
  • 举报
回复
SELECT DATEDIFF('d','2008-12-31','2008-12-29')+"天"
yanzhihong2014 2011-11-17
  • 打赏
  • 举报
回复
感谢qgqch2008,问题是我是mysql数据库,如何SELECT DATEDIFF('2008-12-31','2008-12-29')连接上“天”呢
SELECT DATEDIFF('2008-12-31','2008-12-29')+"天"不能实现
qgqch2008 2011-11-17
  • 打赏
  • 举报
回复
CREATE TABLE TB (id INT IDENTITY(1,1),[name] VARCHAR(20),[time] VARCHAR(20))
INSERT INTO dbo.TB
SELECT '张三', '2011/8/18 15:47' UNION ALL
SELECT '李四', '2011/8/19 19:47' UNION ALL
SELECT '王五', '2011/8/20 20:47' UNION ALL
SELECT '麻子', '2011/8/21 22:27'

SELECT a.* ,ISNULL(LTRIM(DATEDIFF(HOUR, b.time, a.time) / 24) + '天' +
LTRIM(DATEDIFF(HOUR, b.time,a.time) % 24) + '小時','') AS '處理時間'
FROM dbo.TB a
LEFT JOIN dbo.TB b ON a.id = b.id + 1

DROP TABLE dbo.TB
/*
id name time 處理時間
----------- -------------------- -------------------- ------------------------------
1 张三 2011/8/18 15:47
2 李四 2011/8/19 19:47 1天4小時
3 王五 2011/8/20 20:47 1天1小時
4 麻子 2011/8/21 22:27 1天2小時

(4 個資料列受到影響)

*/
熙风 2011-11-17
  • 打赏
  • 举报
回复
结贴吧
熙风 2011-11-17
  • 打赏
  • 举报
回复
   private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
string dateDiff = "";
if (e.ColumnIndex == 2)
{
if (e.RowIndex >0)
{
DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];
DataGridViewRow row2 = this.dataGridView1.Rows[e.RowIndex - 1];
if (row != null && row2!=null)
{
if (row.Cells["create_date"].Value.ToString() != "" && row.Cells["create_date"].Value!= null)
{
DateTime dt1=Convert.ToDateTime(row.Cells["create_date"].Value.ToString());
DateTime dt2=Convert.ToDateTime(row2.Cells["create_date"].Value.ToString());
TimeSpan ts1 = new TimeSpan(dt1.Ticks);
TimeSpan ts2 = new TimeSpan(dt2.Ticks);
TimeSpan ts = ts1.Subtract(ts2).Duration();
if (int.Parse(ts.Days.ToString()) > 0)
{
dateDiff += ts.Days.ToString() + "天";
}
if (int.Parse(ts.Hours.ToString()) > 0)
{
dateDiff += ts.Hours.ToString() + "小时";
}
e.Value = dt1.ToString() +" "+dateDiff;
}else
{
e.Value=row.Cells["create_date"].Value.ToString() ;
}
}
}
sdl2005lyx 2011-11-17
  • 打赏
  • 举报
回复
先从数据库获取数据:

DataTable table=new DataTable();
//。。。。加入获取数据的代码

DataColumn col = new DataColumn("时间间隔", typeof(string));
table.Columns.Add(col);

for(int i=0;i<table.Rows.Count-1;i++)
{
DateTime dt1 = DateTime.Parse(table.Rows[i][2].ToString());
DateTime dt2 = DateTime.Parse(table.Rows[i+1][2].ToString());

TimeSpan span = dt2 - dt1;
string str = string.Format("{0}{1}",span.Days,span.Hours);
table.Rows[i + 1][3] = str; //注意正确列索引!
}



yanzhihong2014 2011-11-17
  • 打赏
  • 举报
回复
给段代码吧
  • 打赏
  • 举报
回复
很多种方法,LS的在数据库中把sql写好查询出来
也可心绑定的时候增加一个计算列
zhouxingyu896 2011-11-17
  • 打赏
  • 举报
回复
支持楼上大侠的
帮顶
bdmh 2011-11-17
  • 打赏
  • 举报
回复
可以算好后,插入到dataset中,或者在grid的cellformatting中处理,或者cellpaiting事件中处理
yanzhihong2014 2011-11-17
  • 打赏
  • 举报
回复
好像只能同行间计算,怎么上下行计算呢
thinkingforever 2011-11-17
  • 打赏
  • 举报
回复
从数据库里取出来后,放在dataset中,然后便利计算

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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