SQL Server 2008 Bootcamp – Día 2 SQL Server 2008 Nuevos tipos de datos de fecha y hora Información sobre versión Beta • Tanto la información como los ejemplos son relativos a la beta pública de SQL Server 2008 CTP5 • Tanto comandos como funcionalidades pueden diferir de la versión RTM final © 2007 Solid Quality Mentors 2 Tipos “Date” y “Time” Escenarios y requerimientos • • • • • • Separación de tipos de fecha y hora Mayor precisión de fracciones de segundo Mayor rango de datos Conocimiento de zona horaria Consecuente y/o equivalente al SQL Estándar Migración de Base de Datos – Compatibilidad con soluciones de la competencia Tipos “Date” y “Time” Tipo de datos “Date” • DATE – – – – Solo fechas Gran rango desde 0001-01-01 al 9999-12-31 Tipo estándar de SQL Tamaño fijo de almacenamiento de 3 bytes Tipos “Date” y “Time” Soporte de DATE para cadenas y formatos literales • Numeric – mm/dd/yyyy, dd-mm-yyyy, mm.dd.yyyy • Alphabetical – mon dd, yyyy • ISO 8601 – yyyy-mm-dd, yyyymmdd • ODBC – {„yyyy-mm-dd‟} • W3C XML – yyyy-mm-ddZ Tipos “Date” y “Time” Tipo de datos TIME • TIME(n) – Solo tiempo – Precisión opcional asignable por el usuario • Hasta 100 nanosegundos (por defecto) • Por defecto alineado con el SO y .NET – Formato • HH:MI:SS[.nnnnnnn] • Se soportan otros – Tipo de datos SQL Estándar – Almacenamiento variable de 3 a 5 bytes Tipos “Date” y “Time” Tipo de datos con zona horaria • DATETIMEOFFSET(n) – Contiene fecha, hora y offset para zona horaria – Gran rango de datos desde 0001-01-01 a 9999-12-31 – Precisión opcionalmente especificable por el usuario • Hasta 100 nanosegundos (por defecto) • Por defecto alineado con el SO y .NET – Formato • YYYY-MM-DD HH:MI:SS.[.nnnnnnn][+|-]HH:MI • Ófsets de zona horaria con rangos desde -14:00 a 14:00 – Tipo equivalente a SQL Estándar • TIMESTAMP WITH TIME ZONE – Tamaño de almacenamiento variable de 8 a 10 bytes Tipos “Date” y “Time” Interioridades de DATETIMEOFFSET • Los datos son almacenados como valores UTC • Se realiza procesamiento como valores UTC – comparaciones – ordenación – indexación • Se puede devolver la zona horaria original Tipos “Date” y “Time” Nuevos tipos date/time mejorados • DATETIME2(n) – Gran rango de datos desde 0001-01-01 a 9999-12-31 – Precisión opcionalmente especificable por el usuario • Hasta 100 nanosegundos (por defecto) • Por defecto alineado con el SO y .NET – – – – – Equivalente al Estándar SQL (TIMESTAMP) Tamaño de almacenamiento variable de 6 a 8 bytes No soporta zona horaria Alineado con el tipo nativo de .NET DateTime Reemplazo recomendado de los actuales DateTime y smalldatetime Tipos “Date” y “Time” Nuevos tipos date/time mejorados • datetime2 soporta los formatos ISO 8601 completamente – yyyy-mm-dd – yyyymmdd • Los “antiguos” DateTime *todavía* no gestionan yyyy-mm-dd como un formato ISO – Ten cuidado! – Realizado para evitar cambios de comportamiento inesperados © 2007 Solid Quality Mentors 10 Tipos “Date” y “Time” Fracciones de segundo • Por defecto: 100 nanosegundos – 10-millonésima de segundo – Alineado con Windows y con DateTime de .NET • Parámetros de tipo opcional – Numero de dígitos para la parte fraccional de segundo – Puede ser un entero de 0 a 7 (100 nanosegundos) Tipo de columna Formato de cadena literal por defecto Precision Escala DATE YYYY-MM-DD 10 0 TIME HH:MI:SS [.nnnnnnn] 16 7 DATETIMEOFFSET YYYY-MM-DD HH:MI:SS[.nnnnnnn][+|-]HH:MI 34 7 DATETIME2 YYYY-MM-DD HH:MI:SS[.nnnnnnn] 27 7 DATETIME2(0) YYYY-MM-DD HH:MI:SS 19 0 Tipos “Date” y “Time” Integración en servidor • Tipo de datos nativo, completamente integrado – Compatible con todas las funciones (built-in) – Todas las funcionalidades • Nuevas partes de fecha añadidas – – – – – DATEADD, DATEDIFF, DATEPART, DATENAME microsegundos (mcs) nanosegundos (ns) TZoffset (tz) Número de semana ISO 8601 Tipos “Date” y “Time” Nuevas funciones “built-in” • Valores del sistema – SYSDATETIME(), SYSUTCDATETIME() – SYSDATETIMEOFFSET() • Consciencia del horario de verano según el SO • Manipulación del offset de zona horaria – TODATETIMEOFFSET() – SWITCHOFFSET() Tipos “Date” y “Time” Soporte a bajo nivel en aplicaciones cliente • Los metadatos son nvarchar o varchar • Los datos son una cadena de caracteres literal en formato SQL/ISO Tipo de columna Formato por defecto de cadena literal DATE YYYY-MM-DD TIME HH:MI:SS [.nnnnnnn] DATETIMEOFFSET YYYY-MM-DD HH:MI:SS[.nnnnnnn][+|-]HH:MI DATETIME2 YYYY-MM-DD HH:MI:SS[.nnnnnnn] Tipos “Date” y “Time” Funcionalidades avanzadas del servidor • Soporte completo para xs:dateTime – Soporte para valores sin zona horaria – Se puede preservaar el offset de zona horaria • Soporte para .NET nullable<T> en todos los tipos nativos – Ya no hacen falta SqlTypes – Modelo de programación consistente con el CLR Tipos “Date” y “Time” Casos de uso típicos en T-SQL(1) • Obtener el offset temporal del sistema SELECT DATENAME(tz, SYSDATETIMEOFFSET()) AS TZ; TZ -----------------------------+02:00 • Creación de un tipo de datos atómico: “birthday” CREATE TYPE birthday FROM DATE NOT NULL; GO CREATE TABLE Contact ( ContactID , ContactName , ContactBirthday ); int varchar(100) birthday NOT NULL PRIMARY KEY NOT NULL NOT NULL Tipos “Date” y “Time” Casos de uso típicos en T-SQL(2) • DATEFORMAT() no afecta a los literales ISO CREATE TABLE T1 (f1 datetime NOT NULL PRIMARY KEY) CREATE TABLE T2 (f1 datetime2 NOT NULL PRIMARY KEY) SET DATEFORMAT ydm INSERT T1 VALUES ('2007-08-13') INSERT T2 VALUES ('2007-08-13') -- esto falla! • Obtener la fecha y hora actuales del sistema SELECT SYSDATETIME(), SYSDATETIMEOFFSET(), SYSUTCDATETIME() DT Function ------------------SYSDATETIME() SYSDATETIMEOFFSET() SYSUTCDATETIME() Result ---------------------------------2007-10-05 00:23:24.1904448 +00:00 2007-10-05 00:23:24.1904448 +02:00 2007-10-04 22:23:24.1904448 +00:00 Tipos “Date” y “Time” Casos de uso típicos en T-SQL(3) • Obtener fecha/hora local o UTC datetimeoffset SELECT , TZ ------Local UTC CONVERT(datetime2, SYSDATETIMEOFFSET(), 0) CONVERT(datetime2, SYSDATETIMEOFFSET(), 1); Result --------------------------2007-10-05 00:57:27.7188944 2007-10-04 22:57:27.7188944 • Obtener fecha/hora local de una zona horaria distinta SELECT , SYSDATETIME(), SYSDATETIMEOFFSET() CONVERT(datetime2 , SWITCHOFFSET(SYSDATETIMEOFFSET(), '+01:00')); DT Function ------------------SYSDATETIME() SYSDATETIMEOFFSET() SWITCHOFFSET(...) Result ---------------------------------2007-10-05 01:20:38.6990256 +00:00 2007-10-05 01:20:38.6990256 +02:00 2007-10-05 00:20:38.6990256 +00:00 Tipos “Date” y “Time” Casos de uso típicos T-SQL(4) • Utilizando CAST/CONVERT con index seek CREATE TABLE dbo.Search (MyDate datetime2 NOT NULL PRIMARY KEY); SELECT FROM WHERE MyDate dbo.Search MyDate = '09:00:00'; SELECT FROM WHERE MyDate dbo.Search CONVERT(time(0), MyDate) = '09:00:00'; SELECT FROM WHERE MyDate dbo.Search CONVERT(date, MyDate) = '2007-01-01'; Tipos “Date” y “Time” Soporte en proveedores cliente • Completo soporte SNAC (ODBC/OLEDB) en Katmai • Completo soporte SqlClient/ADO.NET en Orcas SQL ODBC OLEDB ADO.NET DATE SQL_TYPE_DATE, SQL_DATE DBTYPE_DBDATE DateTime TIME SQL_TIME, SQL_SS_TIME2 DBTYPE_DBTIME, DBTYPE_DBTIME2 TimeSpan DATETIMEOFFSET SQL_SS_TIMESTAMPO FFSET DBTYPE_DBTIMESTAMP OFFSET DateTimeOffset DATETIME2 SQL_TYPE_TIMESTAMP DBTYPE_DBTIMESTAMP , SQL_TIMESTAMP DateTime Tipos “Date” y “Time” Books online • Nuevos tópicos específicos en CTP4 y posteriores – Tipos de datos fecha, hora, y funciones (T-SQL) – Usando datos fecha y hora – Mapeo de tipos de datos temporales con consultas distribuidas – Utilizando XML con los nuevos tipos de datos de fecha y hora DEMO 1 Fecha y hora © 2007 Solid Quality Mentors 22 Tipos de datos Fecha y Hora Preguntas y Respuestas Links de SQL Server 2008 • Site de SQL Server 2008 – http://www.microsoft.com/sql/2008/ • Ejemplos SQL Server 2008 – http://www.codeplex.com/SqlServerSamples © 2007 Solid Quality Mentors 24