|
Posted by tatata9999 on 10/08/07 16:48
On Oct 7, 9:36 am, Erland Sommarskog <esq...@sommarskog.se> wrote:
> (tatata9...@gmail.com) writes:
> > Interesting idea, Erland, but it did not seem to work for me, maybe I
> > didn't do it right? Only two variations.
>
> We have only seen fragments and pieces of what you have been doing. It
> would help if you posted a create table statement for your table, insert
> statements with sample data, and the desired result given the sample.
> That makes it easy to develop tested query. Without that, we are mainly
> guessing.
>
> --
> Erland Sommarskog, SQL Server MVP, esq...@sommarskog.se
>
> Books Online for SQL Server 2005 athttp://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books...
> Books Online for SQL Server 2000 athttp://www.microsoft.com/sql/prodinfo/previousversions/books.mspx
Very fair. Thank you, and Ed Murphy. Now, the problem is, when I
apply either one of the following sum queries, the result is about 30
hours short of 114 hours, how come? Could my data be compromised?
Or?
-- ddl
CREATE TABLE [dbo].[myTBL] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[mydate] [datetime] NOT NULL default getDate(),
[proj] [varchar] (45) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[start] [char] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[stop] [char] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TRIGGER populateStartOrNot4myTBL
ON dbo.myTBL
AFTER INSERT AS
If exists (select *
from thisTEMP -- for business logic / business rule
where autostart = 1)
begin
UPDATE myTBL
SET start = Cast(DatePart(hh,getDate()) as varchar(2)) + ':' +
Cast(DatePart(n,getDate()) as varchar(2))
WHERE id = (SELECT id FROM inserted)
end
-- sample dml
insert into myTBL(proj, start, stop)
values ('test me','17:00','17:55');
insert into myTBL(proj, start, stop)
values ('test me','8:00','14:25');
insert into myTBL(proj, start)
values ('test me','23:25');
-- suppose, the above one insert, create ID, 3
update myTBL
set stop = '1:15'
where ID = 3
-- now for the row 3, it spans two days
-- reg query 1
select ID, mydate as origdate,convert(char,mydate,101) as mydate,
proj, start, stop,
CASE WHEN (datediff(n,start,stop) < 0) THEN
Left((datediff(n,start,'23:59') + datepart(n,'2007-09-19
10:01:00') + datediff(n,'00:00',stop))/60.0,4)
ELSE Left(datediff(n,start,stop)/60.0,4) END as hours_spent
from myTBL
order by origdate DESC
-- comment: looks good
-- reg q 2
select ID, mydate as origdate,convert(char,mydate,101) as mydate,
proj, start, stop,
CASE WHEN (datediff(n,start,stop) < 0) THEN
(datediff(n,start,stop) + 1440)/60.0
ELSE Left(datediff(n,start,stop)/60.0,4) END as hours_spent
from myTBL
order by origdate DESC
-- comment: looks good
-- sum
-- try 1
set ANSI_WARNINGS OFF;
select proj, SUM(CASE WHEN (datediff(n,start,stop)/60 < 0)
THEN datediff(n,start,'23:59') + datepart(n,'2007-09-19
10:01:00') + datediff(n,'00:00',stop)/60
WHEN (datediff(n,start,stop)/60 > 0)
THEN (datediff(n,start,stop)/60)
End) * 1.0 as total_hours
from myTBL
-- where ID < 3
group by proj with rollup
set ANSI_WARNINGS ON;
-- comment: bad
-- try 2
set ANSI_WARNINGS OFF;
select proj, SUM(CASE WHEN (datediff(n,start,stop)/60 < 0)
THEN (datediff(n,start,stop) + 1440)/60.0
WHEN (datediff(n,start,stop)/60 > 0)
THEN (datediff(n,start,stop)/60.0)
End) as total_hours
from myTBL
group by proj with rollup
set ANSI_WARNINGS ON;
-- comment: not bad
-- try 3
set ANSI_WARNINGS OFF;
select proj, SUM(convert(decimal(10,2),CASE WHEN
(datediff(n,start,stop)/60 < 0)
THEN (datediff(n,start,stop) + 1440)/60.0
WHEN (datediff(n,start,stop)/60 > 0)
THEN (datediff(n,start,stop)/60.0)
End)) as total_hours
from myTBL
group by proj with rollup
-- comment: not bad
Navigation:
[Reply to this message]
|