-- Database by Doug
-- Douglas Kline
-- 1/30/2019
-- the SwitchOffset function
-- how to use switchoffset
-- function available beginning SQL 2008
-- see "Time Zones and DATETIMEOFFSET" video
-- an update to the previous video
-- thanks to a viewer who pointed this function out to me
-- you know who you are!
SELECT GETDATE() AS [now, somewhere]
-- my time zone is EST -05:00
-- the server is in the Azure US east data center (EST)
-- note that the GETDATE() returns the time GMT, i.e. -00:00
-- the returned time is 5 hours in the future (based on EST)
-- also note that GETDATE() does not contain the time zone,
-- it returns a datetime, which does not contain time zone information
SELECT SQL_VARIANT_PROPERTY(GETDATE(), 'BaseType')
-- you can the server datetime with time zone like this:
SELECT SYSDATETIMEOFFSET(),
SQL_VARIANT_PROPERTY(SYSDATETIMEOFFSET(), 'BaseType')
-- this result proves that Azure SQL returns UTC 00:00
-- my current database server happens to be
-- in the eastern time zone of the US, which is -05:00 UTC
-- so what is the actual time, in EST?
-- observe the difference between the following values
SELECT GETDATE() AS [Azure datetime GMT],
CAST (GETDATE() AS DATETIMEOFFSET) AS [converted Azure datetime GMT],
TODATETIMEOFFSET(GETDATE(), '-05:00') AS [todatetimeoffset result EST], -- but note no hour change
SYSDATETIMEOFFSET() AS [sysdatetimeoffset EST],
SWITCHOFFSET(SYSDATETIMEOFFSET(),'-05:00') AS [switchoffset] -- this is the right one
-- note that GETDATE() is not as accurate
-- for a couple of reasons
-- fewer decimal points
-- but also
-- datetimes' one-thousandths place is always 0, 3, or 7
-- from doc'n "Rounded to increments of .000, .003, or .007 seconds"
-- so, before SWITCHOFFSET existed, ...
SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(),'-05:00') AS [EST the easy way],
TODATETIMEOFFSET(DATEADD(HOUR, -5, SYSDATETIMEOFFSET()), '-05:00') AS [EST the hard way]
-- so, thinking of a DATETIMEOFFSET data type as a complex object
-- with many different parts: year, month, day, hour, time zone, etc.
-- it looks like SWITCHOFFSET changes two things: time zone and hour
-- but let's say that my source datetimeoffset
-- is near a time part boundary,
-- for example, the end of the year
DECLARE @NewYearsEveEST AS DATETIMEOFFSET
DECLARE @NewYearsEveGMT AS DATETIMEOFFSET
SET @NewYearsEveEST = DATETIMEOFFSETFROMPARTS(2019,12,31,23,50,0,0,-5,0,7)
SET @NewYearsEveGMT = SWITCHOFFSET(@NewYearsEveEST,'+00:00')
SELECT @NewYearsEveEST AS [NYEveEST],
@NewYearsEveGMT AS [NYEveGMT]
-- note that the year, month, day, hour, and time zone changed
-- in summary
-- SWITCHOFFSET is really helpful to have
-- simpler code, likely more reliable
-- use SYSDATETIMEOFFSET to get max precision w/Offset
-- Database by Doug
-- Douglas Kline
-- 1/30/2019
-- the SwitchOffset function
Wednesday, January 30, 2019
The SwitchOffset Function
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment