November 13, 2017 at 4:47 am
Hi
I've imported perfmon data from 100 SQL servers into a central database to analyse the results.
The time field has imported as a Char 24 and is in the format 2017-11-10 09:47:43.935.
I'd like to round this data to the nearest 15 seconds, (the interval of the perfmon collection) so I can group by the time.
Any suggestions?
Alex
November 13, 2017 at 5:03 am
alex.palmer - Monday, November 13, 2017 4:47 AMHiI've imported perfmon data from 100 SQL servers into a central database to analyse the results.
The time field has imported as a Char 24 and is in the format 2017-11-10 09:47:43.935.
I'd like to round this data to the nearest 15 seconds, (the interval of the perfmon collection) so I can group by the time.
Any suggestions?
Alex
Quick suggestion
😎
declare @dt datetime = '2017-11-10 09:47:43.935'
select dateadd(second, ((datepart(second,convert(datetime2(0),@dt,0)) / 15) * 15),dateadd(second,-datepart(second,convert(datetime2(0),@dt,0)),convert(datetime2(0),@dt,0)))
November 13, 2017 at 5:17 am
Or this - it has fewer moving parts and seems to run a little bit faster than Eirikur's.
SELECT
DATEADD(second,-DATEPART(second,create_date)%15,DATEADD(ms,-DATEPART(ms,create_date),create_date))
FROM sys.all_objects
John
November 13, 2017 at 6:10 am
Hi
Thanks for the answers I used Eirikur Eiriksson answer in the end because I found the code easier.
Looks like I'm not the first personm to have issues with the date field for perfmon. I had to use this
convert(datetime,substring(CounterDateTime,1,23)
From here https://www.sqlservercentral.com/Forums/953187/Problem-to-convert-a-char24-field-to-datetime
to get a date\time I could use.
Cheers
Alex
November 13, 2017 at 8:15 am
If both simplicity and performance are important AND the datetimes will always be > '2000-01-01', then the following will do the trick. (Replace the sample date with the column name).
SELECT DATEADD(ss,DATEDIFF(ss,36524,'2017-11-10 09:47:43.935')/15*15,36524) -- 36524 = '2000-01-01';
Because of the limit of positive integers being 2,147,483,647 for seconds, the following code demonstrates when this method will quit working...
SELECT DATEADD(ss,2147483647,36524);
... so it's good to go for at least the next 50 years without modification. 😉
As a bit of a sidebar, this may work for 68 years prior to the year 2000 but I've not tested for that.
--Jeff Moden
Change is inevitable... Change for the better is not.
November 13, 2017 at 11:46 am
Jeff Moden - Monday, November 13, 2017 8:15 AMIf both simplicity and performance are important AND the datetimes will always be > '2000-01-01', then the following will do the trick. (Replace the sample date with the column name).
SELECT DATEADD(ss,DATEDIFF(ss,36524,'2017-11-10 09:47:43.935')/15*15,36524) -- 36524 = '2000-01-01';Because of the limit of positive integers being 2,147,483,647 for seconds, the following code demonstrates when this method will quit working...
SELECT DATEADD(ss,2147483647,36524);... so it's good to go for at least the next 50 years without modification. 😉
As a bit of a sidebar, this may work for 68 years prior to the year 2000 but I've not tested for that.
I don't see any need for the obscure 36524, just use the base date directly:
SELECT DATEADD(SECOND, DATEDIFF(SECOND, '20000101', '2017-11-10 09:47:43.935')/15*15, '20000101')
SQL DBA,SQL Server MVP(07, 08, 09) "It's a dog-eat-dog world, and I'm wearing Milk-Bone underwear." "Norm", on "Cheers". Also from "Cheers", from "Carla": "You need to know 3 things about Tortelli men: Tortelli men draw women like flies; Tortelli men treat women like flies; Tortelli men's brains are in their flies".
November 13, 2017 at 12:22 pm
ScottPletcher - Monday, November 13, 2017 11:46 AMJeff Moden - Monday, November 13, 2017 8:15 AMIf both simplicity and performance are important AND the datetimes will always be > '2000-01-01', then the following will do the trick. (Replace the sample date with the column name).
SELECT DATEADD(ss,DATEDIFF(ss,36524,'2017-11-10 09:47:43.935')/15*15,36524) -- 36524 = '2000-01-01';Because of the limit of positive integers being 2,147,483,647 for seconds, the following code demonstrates when this method will quit working...
SELECT DATEADD(ss,2147483647,36524);... so it's good to go for at least the next 50 years without modification. 😉
As a bit of a sidebar, this may work for 68 years prior to the year 2000 but I've not tested for that.
I don't see any need for the obscure 36524, just use the base date directly:
SELECT DATEADD(SECOND, DATEDIFF(SECOND, '20000101', '2017-11-10 09:47:43.935')/15*15, '20000101')
INTs tend to be a tiny bit faster than strings. The comment removes any doubt as to what the number is. There's also no need to spell out "SECOND". If you don't know what "SS" stands for, then you may have bigger problems and I would be concerned if someone that didn't know what it meant was modifying the code. 😉
--Jeff Moden
Change is inevitable... Change for the better is not.
Viewing 7 posts - 1 through 6 (of 6 total)
You must be logged in to reply to this topic. Login to reply