Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
clbal
Starting Member
5 Posts |
Posted - 2009-06-09 : 04:00:44
|
I've got a table with listings with the fieldsid, fromdat, todat"id" is the ID for each listing and "fromdat" & "todat" are smalldatetime-fields and they tell us the starting and ending times for each listing.Now to my question:I want to know for each calendar-date how many listings that are live at 09:00.What should my SQL-query be?Anyone?Regards,Björn |
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2009-06-09 : 04:02:42
|
[code]select *from listingswhere fromdat <= '09:00:00'and todat >= '09:00:00'[/code]by the way, the Script Library are for posting workable scripts not mean for asking question. KH[spoiler]Time is always against us[/spoiler] |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2009-06-09 : 04:04:41
|
Are you using SQL Server 2005? E 12°55'05.63"N 56°04'39.26" |
|
|
clbal
Starting Member
5 Posts |
Posted - 2009-06-09 : 04:07:22
|
Hm, thanks! But I'd better specify what i'd like my output table to be like:Date LiveListingsAt9am2009-01-02 13427432009-01-02 1424321 ... |
|
|
clbal
Starting Member
5 Posts |
Posted - 2009-06-09 : 04:11:00
|
quote: Originally posted by Peso Are you using SQL Server 2005?
Yes it's SQL Server 2005 |
|
|
clbal
Starting Member
5 Posts |
Posted - 2009-06-09 : 04:15:51
|
quote: Originally posted by khtanby the way, the Script Library are for posting workable scripts not mean for asking question.
Sorry, I'm totally new here. Is there somewhere to put questions? |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2009-06-09 : 04:16:47
|
Here is a suggestion that will work for both SQL Server 2000 and SQL Server 2005-- Prepare sample dataDECLARE @Sample TABLE ( FromDat SMALLDATETIME, ToDat SMALLDATETIME )INSERT @SampleSELECT '20090609 08:00', '20090609 10:00' UNION ALLSELECT '20090609 10:00', '20090609 11:00' UNION ALLSELECT '20090608 23:00', '20090609 09:30' UNION ALLSELECT '20090610 08:00', '20090611 05:30' UNION ALLSELECT '20090612 18:00', '20090614 09:30'-- PesoSELECT DATEADD(DAY, v.Number, DATEDIFF(DAY, 0, s.FromDat)) AS [Date], SUM(CASE WHEN v.Number = 0 AND DATEPART(HOUR, s.FromDat) > 9 THEN 0 WHEN v.Number = DATEDIFF(DAY, s.FromDat, s.ToDat) AND DATEPART(HOUR, s.ToDat) < 9 THEN 0 ELSE 1 END) AS LiveListingsAt9amFROM @Sample AS sINNER JOIN master..spt_values AS v ON v.Type = 'P'WHERE v.Number <= DATEDIFF(DAY, s.FromDat, s.ToDat)GROUP BY DATEADD(DAY, v.Number, DATEDIFF(DAY, 0, s.FromDat))ORDER BY DATEADD(DAY, v.Number, DATEDIFF(DAY, 0, s.FromDat)) E 12°55'05.63"N 56°04'39.26" |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2009-06-09 : 04:17:44
|
quote: Originally posted by clbal
quote: Originally posted by khtanby the way, the Script Library are for posting workable scripts not mean for asking question.
Sorry, I'm totally new here. Is there somewhere to put questions?
No problem. It will be easier for others to post solution according to the version of the SQL server you are using.Since you are using SQL 2005, you should post here http://www.sqlteam.com/forums/forum.asp?FORUM_ID=30 KH[spoiler]Time is always against us[/spoiler] |
|
|
clbal
Starting Member
5 Posts |
Posted - 2009-06-09 : 04:37:33
|
quote: Originally posted by Peso Here is a suggestion that will work for both SQL Server 2000 and SQL Server 2005-- Prepare sample dataDECLARE @Sample TABLE ( FromDat SMALLDATETIME, ToDat SMALLDATETIME )INSERT @SampleSELECT '20090609 08:00', '20090609 10:00' UNION ALLSELECT '20090609 10:00', '20090609 11:00' UNION ALLSELECT '20090608 23:00', '20090609 09:30' UNION ALLSELECT '20090610 08:00', '20090611 05:30' UNION ALLSELECT '20090612 18:00', '20090614 09:30'-- PesoSELECT DATEADD(DAY, v.Number, DATEDIFF(DAY, 0, s.FromDat)) AS [Date], SUM(CASE WHEN v.Number = 0 AND DATEPART(HOUR, s.FromDat) > 9 THEN 0 WHEN v.Number = DATEDIFF(DAY, s.FromDat, s.ToDat) AND DATEPART(HOUR, s.ToDat) < 9 THEN 0 ELSE 1 END) AS LiveListingsAt9amFROM @Sample AS sINNER JOIN master..spt_values AS v ON v.Type = 'P'WHERE v.Number <= DATEDIFF(DAY, s.FromDat, s.ToDat)GROUP BY DATEADD(DAY, v.Number, DATEDIFF(DAY, 0, s.FromDat))ORDER BY DATEADD(DAY, v.Number, DATEDIFF(DAY, 0, s.FromDat))
THIS WORKS!!THANKS, PESO!!I ran it on the server and the query was finished after 10 minutes. (It was about 100.000.000 records to deal with) |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2009-06-09 : 04:40:50
|
Well, 10 minutes for 100 million records is not THAT bad...The query will be MUCH faster if the dates doesn't span over midnight.But it requires another solution, like this-- Prepare sample dataDECLARE @Sample TABLE ( FromDat SMALLDATETIME, ToDat SMALLDATETIME )INSERT @SampleSELECT '20090609 08:00', '20090609 10:00' UNION ALLSELECT '20090609 10:00', '20090609 11:00' UNION ALLSELECT '20090608 01:00', '20090608 09:30' UNION ALLSELECT '20090611 02:00', '20090611 05:30' UNION ALLSELECT '20090612 08:00', '20090612 09:30'-- PesoSELECT DATEADD(DAY, DATEDIFF(DAY, 0, FromDat), 0) AS [Date], SUM(CASE WHEN 9 BETWEEN DATEPART(HOUR, FromDat) AND DATEPART(HOUR, ToDat) THEN 1 ELSE 0 END) AS LiveListingsAt9amFROM @SampleGROUP BY DATEADD(DAY, DATEDIFF(DAY, 0, FromDat), 0)ORDER BY DATEADD(DAY, DATEDIFF(DAY, 0, FromDat), 0) E 12°55'05.63"N 56°04'39.26" |
|
|
|
|
|
|
|