A partir de la versión 2016. Podemos utilizar sys.time_zone_info para ver todas las zonas horarias. Esta funcion nos devuelve información sobre las zonas horarias instaladas en la computadora.
SELECT * FROM sys.time_zone_info
SELECT GETDATE() AT TIME ZONE 'W. Europe Standard Time' [Hora España],
GETDATE() AT TIME ZONE 'Singapore Standard Time' [Hora Singapore]
Un ejemplo de como obtener las hora en el PERU
Básicamente se obtiene por DATEPART(TZ,SYSDATETIMEOFFSET()) la zona horaria del servidor en minutos, y en @DstOffset configuramos la que le correspondería a Perú, la diferencia se la suma en minutos al GETDATE() (hora server), y con esto obtendríamos la hora deseada. Lo que es importante notar, que los horarios de verano locales en Chile, me imagino que son actualizados a nivel servidor, de forma tal que @SrcOffset debiera ser el correcto, pero el de Perú, eventualmente debiera ser ajustado, -300 (5 horas) es el actual, -360 para (-6 horas utc) o -240 (-4 horas utc). Las funciones DATEPART Y SYSDATETIMEOFFSET son compatibles con SQL SERVER 2008.
DECLARE @SrcOffset INT
DECLARE @DstOffset INT
DECLARE @Now DATETIME
SELECT @SrcOffset = DATEPART(TZ,SYSDATETIMEOFFSET()),
@DstOffset = -300,
@Now = GETDATE()
SELECT @Now AS 'LocalDate',
DATEADD(MINUTE, @DstOffset - @SrcOffset, @Now) AS 'PeruDate'
Funciones SYSDATETIME, SYSDATETIMEOFFSET y SYSUTCDATETIME
Las funciones de fecha y hora de alta precisión de SQL Server tienen una escala de 7 y son:
SYSDATETIME: retorna la fecha/hora ordenador en la que se ejecuta SQL Server
SYSDATETIMEOFFSET: retorna la fecha/hora ordenador en la que se ejecuta SQL Server más el desplazamiento de UTC
SYSUTCDATETIME: retorna la fecha/hora ordenador en la que se ejecuta SQL Server como UTC
SELECT SYSDATETIME() AS 'DateAndTime'; -- return datetime2(7)
SELECT SYSDATETIMEOFFSET() AS 'DateAndTime+Offset'; -- datetimeoffset(7)
SELECT SYSUTCDATETIME() AS 'DateAndTimeInUtc'; -- returns datetime2(7)
Función DATENAME
DATENAME(): devuelve una cadena correspondiente a la parte de fecha especificada
SELECT DATENAME(YEAR, GETDATE()) AS 'Year',
DATENAME(QUARTER, GETDATE()) AS 'Quarter',
DATENAME(MONTH, GETDATE()) AS 'Month',
DATENAME(DAYOFYEAR, GETDATE()) AS 'DayOfYear',
DATENAME(DAY, GETDATE()) AS 'Day',
DATENAME(WEEK, GETDATE()) AS 'Week',
DATENAME(WEEKDAY, GETDATE()) AS 'WeekDay',
DATENAME(HOUR, GETDATE()) AS 'Hour',
DATENAME(MINUTE, GETDATE()) AS 'Minute',
DATENAME(SECOND, GETDATE()) AS 'Second',
DATENAME(MILLISECOND, GETDATE()) AS 'MilliSecond',
DATENAME(MICROSECOND, GETDATE()) AS 'MicroSecond',
DATENAME(NANOSECOND, GETDATE()) AS 'NanoSecond',
DATENAME(ISO_WEEK, GETDATE()) AS 'Week'
Función DATEPART
DATEPART(): devuelve un número entero correspondiente a la parte de fecha especificada
SELECT DATEPART(YEAR, GETDATE()) AS 'Year',
DATEPART(QUARTER, GETDATE()) AS 'Quarter',
DATEPART(MONTH, GETDATE()) AS 'Month',
DATEPART(DAYOFYEAR, GETDATE()) AS 'DayOfYear',
DATEPART(DAY, GETDATE()) AS 'Day',
DATEPART(WEEK, GETDATE()) AS 'Week',
DATEPART(WEEKDAY, GETDATE()) AS 'WeekDay',
DATEPART(HOUR, GETDATE()) AS 'Hour',
DATEPART(MINUTE, GETDATE()) AS 'Minute',
DATEPART(SECOND, GETDATE()) AS 'Second',
DATEPART(MILLISECOND, GETDATE()) AS 'MilliSecond',
DATEPART(MICROSECOND, GETDATE()) AS 'MicroSecond',
DATEPART(NANOSECOND, GETDATE()) AS 'NanoSecond',
DATEPART(ISO_WEEK, GETDATE()) AS 'Week'
Funciones DATEFROMPARTS, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DATETIMEOFFSETFROMPARTS, SMALLDATETIMEFROMPARTS y TIMEFROMPARTS
DATEFROMPARTS(): retorna una fecha a partir de la fecha especificada
DATETIME2FROMPARTS(): retorna una fecha y hora2 de la parte especificada
DATETIMEFROMPARTS(): retorna una fecha y hora de la parte especificada
DATETIMEOFFSETFROMPARTS(): retorna un datetimeoffset de la parte especificada
SMALLDATETIMEFROMPARTS(): retorna una pequeña fecha y hora de la parte especificada
TIMEFROMPARTS(): retorna un tiempo de la parte especificada
SELECT DATEFROMPARTS(2019,1,1) AS 'Date', -- retorna date
DATETIME2FROMPARTS(2019,1,1,6,0,0,0,1) AS 'DateTime2', -- retorna datetime2
DATETIMEFROMPARTS(2019,1,1,6,0,0,0) AS 'DateTime', -- retorna datetime
DATETIMEOFFSETFROMPARTS(2019,1,1,6,0,0,0,0,0,0) AS 'Offset', -- retorna datetimeoffset
SMALLDATETIMEFROMPARTS(2019,1,1,6,0) AS 'SmallDateTime', -- retorna smalldatetime
TIMEFROMPARTS(6,0,0,0,0) AS 'Time' -- retorna time
SELECT DATEADD(DAY,1,GETDATE()) AS 'DatePlus1',
EOMONTH(GETDATE(),1) AS 'LastDayOfNextMonth',
SWITCHOFFSET(GETDATE(), -6) AS 'NowMinus6',
TODATETIMEOFFSET(GETDATE(), -2) AS 'Offset'
Leave a Reply