-- Database by Doug
-- Douglas Kline
-- 10/18/2018
-- Time Zones and DateTimeOffset
-- how to use time zones and convert from one to another
-- first, how to think about date/time/datetime in SQL
-- suppose I do this:
SELECT GETDATE() AS [now, somewhere]
-- the data type that is returned is a datetime
-- I can show this:
SELECT SQL_VARIANT_PROPERTY(GETDATE(), 'BaseType')
-- think of the datetime data type as a
-- multi-part object that holds each
-- part as a separate value
-- for example:
SELECT GETDATE(),
DATEPART(YEAR, GETDATE()) AS [year],
DATEPART(MONTH, GETDATE()) AS [month],
DATEPART(DAY, GETDATE()) AS [day],
DATEPART(HOUR, GETDATE()) AS [hour],
DATEPART(SECOND, GETDATE()) AS [second],
DATEPART(MILLISECOND, GETDATE()) AS [millisecond]
-- note that all the parts are whole numbers
-- DATEPART() always returns whole numbers - no decimals
-- and when we manipulate datetimes, we use whole numbers:
SELECT GETDATE() AS [now],
DATEADD(DAY, 2, GETDATE()) AS [2 days from now],
DATEADD(DAY, 2.5, GETDATE()) AS [2.5 days from now?],
DATEADD(HOUR, 12,
DATEADD(DAY, 2, GETDATE()))AS [2.5 days from now]
-- look at that last entry again
-- notice that 2.5 was truncated to an integer
-- there is no such thing as a fractional part of a datetime
-- regardless of how SQL Server stores the date/time/datetime
-- under the covers
-- it treats each part as a separate integer value
-- so what about time zones?
-- since datetime (and datetime2) doesn't have a time zone part
-- we need a new data type: datetimeoffset
-- you can the server datetime with time zone like this:
SELECT SYSDATETIMEOFFSET(),
SQL_VARIANT_PROPERTY(SYSDATETIMEOFFSET(), 'BaseType')
-- my current database server happens to be
-- in the eastern time zone of the US, which is -04:00 UTC
-- note that the datetimeoffset data type
-- has everything that datetime does
-- but additionally, it has another part, the time zone
-- so how would I show the actual east coast time?
-- you might think that the function TODATETIMEOFFSET
-- would do that for you, but all it really does is
-- add the time zone to a datetime
SELECT TODATETIMEOFFSET(GETDATE(),'-04:00') AS [time on east coast?],
SYSDATETIMEOFFSET() AS [time on east coast],
CAST(GETDATE() AS DATETIMEOFFSET) AS [time on east coast?]
-- note that the hours are the same
-- it didn't really move time zones for you
-- it just added the time zone information you gave it
-- to actually adjust the hours, you need to
-- actually add/subtract the hours
SELECT GETDATE() AS [implied time zone],
TODATETIMEOFFSET
(
GETDATE(),
'-00:00'
) AS [explicit UTC +00:00 time zone],
DATEADD(hour, -4, GETDATE()) AS [east coast time, implied time zone],
TODATETIMEOFFSET
(
DATEADD(hour, -4, GETDATE()),
'-04:00'
) AS [east coast with time zone]
SELECT GETDATE(), SYSDATETIMEOFFSET()
-- in summary
-- DATETIMEOFFSET is a DATETIME with additional information: the time zone
-- TODATETIMEOFFSET converts from DATETIME to DATETIMEOFFSET
-- but doesn't add or subtract time
-- to take a datetime from one time zone, and show it in another
-- timezone, you have to add/subtract the hours yourself
-- and set the correct time zone in a DATETIMEOFFSET
-- Database by Doug
-- Douglas Kline
-- 10/18/2018
-- Time Zones and DateTimeOffset
Saturday, October 20, 2018
Time zones and the DATETIMEOFFSET data type in SQL
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment