2017-08-03 126 views
0

嗨,大家好我有这样的c#问题,然后我写了一个计算员工工时的计划,计算总小时数(Ore Fine - Ore Inizio - Pausa)计算的查询。我的问题是,暂停必须以小时,分钟格式插入(例如,1.30)如何计算员工使用以下查询的总时间?我希望我已经解释计算在SqlServer上暂停工作所花的时间 - C#

OreInizio为datetime

OreFine为datetime

保萨是浮法


+0

什么是数据类型? –

+0

is float @BogdanSahlean – riki

回答

2

尝试`dbo.RisorseUmane.Pausa`专栏的

select 
    [IdRisorseUmane], 
    [IdUtente], 
    [IdCantiere], 
    CONVERT(varchar(5), DATEADD(minute, DATEDIFF(minute, [OreInizio], [OreFine]) - cast([Pausa] * 60 as int), 0), 114) as [TotaleOre] 
from [RisorseUmane] 
where [IdCantiere] = @id; 
+0

我打印一个负数,不正确 – riki

+0

@RiccardoPirani我用小提琴选择'CONVERT(varchar(5),DATEADD(minute,DATEDIFF(minute,'2017-07-26 12 :00:00','2017-07-26 18:00:00') - cast(1.5 * 60为int),0),114)'和结果为'04:30'您的输入数据是否正确? – Dmitry

+0

非常感谢您,我也解释了这一点,事实是我的客户已经在使用该软件并输入了错误的值,但是谢谢 – riki

1

先取这两个日期时间列值之间的差异用pausa * 60减去它(使其成为分钟)。

查询

select [IdRisorseUmane], [IdUtente], [IdCantiere], 
cast(cast((
datediff(minute, [OreInizio], [OreFine]) - ([Pausa] * 60)) as int)/60 as varchar) + ':' 
+ right('0' + cast(cast((
datediff(minute, [OreInizio], [OreFine]) - ([Pausa] * 60)) as int) % 60 as varchar(2)), 2) 
as [TotaleOre] 
from [RisorseUmane] 
where [IdCantiere] = @id; 

像你这样where IdCantiere='" + IdCantiere + "'不要单引号内传递值。
它对SQL注入攻击是开放的。始终使用参数。

+0

如果我按照你告诉我的结果TotaleOre你总是看到错误的是-510 – riki

+0

@RiccardoPirani:更新了我的答案。 – Wanderer

+0

这是不正确的看图片什么是我,我从负面时间 – riki