SYSUTCDATETIMEOFFSET()
function for TODATETIMEOFFSET(SYSUTCDATETIME(),'+00:00')
SYSUTCDATETIMEOFFSET()
function for TODATETIMEOFFSET(SYSUTCDATETIME(),'+00:00')
/*************************************************************************
* NAME:
* dbo.toUSTZ
*
* TYPE:
* Function
*
* DESCRIPTION:
* Converts a US Timezone to DateTimeOffset accounting for Daylight Savings Time
* DST in US begins at 2:00 a.m. on the second Sunday of March and
* ends at 2:00 a.m. on the first Sunday of November
* REF: http://www.nist.gov/pml/div688/dst.cfm
*
* RETURNS:
* datetimeoffset(0) (ie: '2014-10-31 18:25:51 +00:00')
*
* PARAMETERS:
* @thedate datetime2 --the date to be converted
* @timezone char(2) --date's US time zone
* Code ST DST Time Zone
* UT +0 +0 Universal Time
* AT -4 -4 Atlantic
* ET -5 -4 Eastern
* CT -6 -5 Central
* MT -7 -6 Mountain
* AZ -7 -7 Arizona
* PT -8 -7 Pacific
* AK -9 -8 Alaska
* HT -10 -10 Hawaii
* ST -11 -11 Samoa
* CH +10 +10 Chamorro
*
* TODO: Add additional years and/or find more elegant way to do this...
* REF: http://www.nist.gov/pml/div688/localtime.cfm#zones
*
* REVISION HISTORY:
* 20141102 JMO Created
*************************************************************************/
ALTER FUNCTION [dbo].[toUSTZ]
( @thedate datetime2
, @timezone char(2)
)
RETURNS datetimeoffset(0)
AS
BEGIN
DECLARE @offsettime datetimeoffset(0)
, @tzoffset varchar(10)
--TODO: need function for second sunday in march and first sunday in november
-- or make lookup table - but would it be more efficient?
IF @thedate BETWEEN '20100314 02:00:00' AND '20101107 01:59:59'
OR @thedate BETWEEN '20110313 02:00:00' AND '20111106 01:59:59'
OR @thedate BETWEEN '20120311 02:00:00' AND '20121104 01:59:59'
OR @thedate BETWEEN '20130310 02:00:00' AND '20131103 01:59:59'
OR @thedate BETWEEN '20140309 02:00:00' AND '20141102 01:59:59'
OR @thedate BETWEEN '20150308 02:00:00' AND '20151101 01:59:59'
OR @thedate BETWEEN '20160313 02:00:00' AND '20161106 01:59:59'
OR @thedate BETWEEN '20170312 02:00:00' AND '20171105 01:59:59'
OR @thedate BETWEEN '20180311 02:00:00' AND '20181104 01:59:59'
BEGIN
SELECT @tzoffset = CASE @timezone
WHEN 'UT' THEN '+00:00'
WHEN 'AT' THEN '-04:00'
WHEN 'ET' THEN '-04:00'
WHEN 'CT' THEN '-05:00'
WHEN 'MT' THEN '-06:00'
WHEN 'AZ' THEN '-07:00'
WHEN 'PT' THEN '-07:00'
WHEN 'AK' THEN '-08:00'
WHEN 'HT' THEN '-10:00'
WHEN 'ST' THEN '-11:00'
WHEN 'CH' THEN '+10:00'
ELSE NULL
END
END
ELSE
BEGIN
SELECT @tzoffset = CASE @timezone
WHEN 'UT' THEN '+00:00'
WHEN 'AT' THEN '-04:00'
WHEN 'ET' THEN '-05:00'
WHEN 'CT' THEN '-06:00'
WHEN 'MT' THEN '-07:00'
WHEN 'AZ' THEN '-07:00'
WHEN 'PT' THEN '-08:00'
WHEN 'AK' THEN '-09:00'
WHEN 'HT' THEN '-10:00'
WHEN 'ST' THEN '-11:00'
WHEN 'CH' THEN '+10:00'
ELSE NULL
END
END
SET @offsettime = todatetimeoffset( @thedate, @tzoffset )
RETURN(@offsettime)
END --f_toUSTZ
GO
/*************************************************************************
* NAME:
* dbo.toUTC
*
* TYPE:
* Function
*
* DESCRIPTION:
* Converts to UTC DateTimeOffset accounting for Daylight Savings Time
*
* RETURNS:
* datetimeoffset(0) (ie: '2014-10-31 18:25:51 +00:00')
*
* PARAMETERS:
* @thedate datetime2 --the date to be converted
* @timezone char(2) --the date's US time zone
* Zone ST DST
* UT +0 +0 Universal Time
* AT -4 -4 Atlantic
* ET -5 -4 Eastern
* CT -6 -5 Central
* MT -7 -6 Mountain
* AZ -7 -7 Arizona
* PT -8 -7 Pacific
* AK -9 -8 Alaska
* HT -10 -10 Hawaii
* ST -11 -11 Samoa
* CH +10 +10 Chamorro
* REF: http://www.nist.gov/pml/div688/localtime.cfm#zones
*
* REFERENCES:
* dbo.toUSTZ
*
* REVISION HISTORY:
* 20141102 JMO Created
*************************************************************************/
CREATE FUNCTION [dbo].[toUTC]
( @thedate datetime2
, @timezone char(2)
)
RETURNS datetimeoffset(0)
AS
BEGIN
DECLARE @offsettime datetimeoffset(0)
, @utctime datetimeoffset(0)
SET @offsettime = dbo.toUSTZ( @thedate, @timezone )
SET @utctime = switchoffset( @offsettime, '+00:00' )
RETURN(@utctime)
END --toUTC
GO
restore headeronly
from disk = 'V:\backups\mydb.bak'
go
restore filelistonlyfrom disk = 'V:\backups\mydb.bak'
go
restore verifyonly
from disk = 'V:\backups\mydb.bak'
go
-- =============================================
-- Author: sqlforge.blogspot.com
-- Create date: 20141008
-- Description: audit ddl changes
-- compatible SQL Server 2005+
-- =============================================
USE [master]
GO
IF EXISTS (SELECT TOP 1 1 FROM [master].[sys].[server_triggers] WITH (NOLOCK) WHERE parent_class_desc = 'SERVER' AND name = N'tr_ObjectChangeAudit') -- sql server 2005+
DISABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER
GO
IF EXISTS (SELECT TOP 1 1 FROM sysobjects WITH (NOLOCK) WHERE TYPE = 'U' AND name = 'changelog')
BEGIN
PRINT 'master.dbo.changelog exists, check to be sure no differences in table from older version'
END
ELSE
BEGIN
CREATE TABLE [dbo].[changelog](
[id] [int] IDENTITY(1,1) NOT NULL,
[databasename] [varchar](256) NOT NULL,
[eventtype] [varchar](50) NOT NULL,
[objectname] [varchar](256) NOT NULL,
[objecttype] [varchar](25) NOT NULL,
[sqlcommand] [varchar](max) NOT NULL,
[eventdate] [datetime] NOT NULL,
[loginname] [varchar](256) NOT NULL
)
ALTER TABLE [dbo].[changelog] ADD CONSTRAINT [df_changelog_eventdate] DEFAULT (getdate()) FOR [eventdate]
END
GO
IF EXISTS (SELECT * FROM sys.objects WITH (NOLOCK) WHERE type = 'P' AND name = 'sp_ObjectChangeAudit' )
DROP PROCEDURE [dbo].[sp_ObjectChangeAudit]
GO
-- =============================================
-- Author: sqlforge.blogspot.com
-- Create date: 20141008
-- Description: audit ddl changes
-- =============================================
CREATE PROCEDURE [dbo].[sp_ObjectChangeAudit]
( @databasename varchar(256)
, @eventtype varchar(50)
, @objectname varchar(256)
, @objecttype varchar(25)
, @sqlcommand varchar(max)
, @loginname varchar(256)
)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [master].[dbo].[changelog]
( databasename
, eventtype
, objectname
, objecttype
, sqlcommand
, loginname
)
VALUES
( @databasename
, @eventtype
, @objectname
, @objecttype
, @sqlcommand
, @loginname
)
END --sp_ObjectChangeAudit
GO
IF EXISTS (SELECT TOP 1 1 FROM [master].[sys].[server_triggers] WITH (NOLOCK) WHERE parent_class_desc = 'SERVER' AND name = N'tr_ObjectChangeAudit') -- sql server 2005+
DISABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER
GO
IF EXISTS (SELECT TOP 1 1 FROM [master].[sys].[server_triggers] WITH (NOLOCK) WHERE parent_class_desc = 'SERVER' AND name = N'tr_ObjectChangeAudit') -- sql server 2005+
DROP TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER
GO
-- =============================================
-- Author: sqlforge.blogspot.com
-- Create date: 20141008
-- Description: audit ddl changes
-- =============================================
CREATE TRIGGER [tr_ObjectChangeAudit]
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR create_procedure, alter_procedure, drop_procedure, create_table, alter_table, drop_table, create_function, alter_function, drop_function
AS
DECLARE @databasename varchar(256)
, @eventtype varchar(50)
, @objectname varchar(256)
, @objecttype varchar(25)
, @sqlcommand varchar(max)
, @loginname varchar(256)
BEGIN
SET NOCOUNT ON;
SET ANSI_PADDING ON;
DECLARE @data xml
SET @data = eventdata()
SELECT @databasename = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)')
, @eventtype = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)')
, @objectname = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)')
, @objecttype = @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)')
, @sqlcommand = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)')
, @loginname = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)')
BEGIN TRY
EXEC [master].[dbo].[sp_ObjectChangeAudit]
@databasename
, @eventtype
, @objectname
, @objecttype
, @sqlcommand
, @loginname
END TRY
BEGIN CATCH
PRINT 'SERVER TRIGGER tr_ObjectChangeAudit ' + ERROR_MESSAGE();
END CATCH
END --tr_ObjectChangeAudit
GO
DISABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER
GO
ENABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER
GO
/*****************************
IF EXISTS ( SELECT TOP 1 1 FROM sysobjects WHERE type = 'P' AND name = 'TESTME_01234' )
DROP PROCEDURE TESTME_01234
GO
CREATE PROCEDURE TESTME_01234
AS
BEGIN
SELECT 1;
END
GO
DROP PROCEDURE TESTME_01234
GO
SELECT * FROM master.dbo.changelog ORDER BY eventdate DESC
GO
****************************************/