I have the following query which calculates today’s midnight value (UTC) as a datetime:
SELECT CONVERT(DATE,GETDATE())+(GETDATE()-GETUTCDATE())
Result: 2011-11-03 19:00:00.000 (for GMT-5 on Nov. 4, 2011)
Not only that, but on occasion, it returns values like these:
2011-11-03 19:00:00.003
2011-11-03 19:00:00.007
2011-11-03 19:00:00.010
…, which are wrong!
There must be a better way to do this.
I already answered this with a solution using DATEADD and DATEDIFF with GETDATE() and GETUTCDATE(), similar to the example given in the original question, but since then I’ve discovered the datetimeoffset data type added in SQL Server 2008. This stores a datetime along with a timezone offset.
How you use this type will depend on whether you want to change the data type of your existing data. If you don’t want to change anything, the following statement will return a datetime type with the local time of midnight:
You could also convert any UTC time into local time using:
The datetimeoffset type is only available using SQL2008 and above. If you need to do this with 2005 and below, you can use a solution similar to the one in the original question, but altered to account for the fact that
GETDATE() - GETUTCDATE()is not an atomic operation and will likely involve milliseconds of difference between when the two are executed.This will take the number minutes between
GETDATE()andGETUTCDATE()and add them onto the local midnight time. Unfortunately, you have to convert back from date to datetime asDATEADDwon’t work with minutes if you give it a date. I’d suggest wrapping this into a user-defined function to make it look less verbose, e.g.