Social Icons

twitter facebook google plus linkedin

miércoles, 10 de octubre de 2012

Usando la funcion dateadd() - Funcion de manejo de fecha y hora en SQL Server

Los motores de bases de datos tienen capacidades para manejar fechas de forma muy precisa. Es por esto que incluyen funciones para trabajar con éstas. Existen muchas funciones, pero en este caso hablaremos sobre dateadd().

La función dateadd() devuelve un valor de fecha, manipulado en uno de los elementos de la fecha. La función tiene 3 parámetros: datepart, el cambio y el elemento donde se va a manipular la fecha.
Los datepart son los componentes de una fecha. Estos son:

  • year

  • quarter

  • month

  • dayofyear

  • day

  • week

  • weekday

  • hour

  • minute

  • second

  • millisecond

  • ms

  • microsecond

  • mcsnanosecond



El numero, debe ser un valor entero. Si es un valor decimal, el decimal se truncará y solo quedará la Porción entera.

Ejemplo:
Agregar un año a la fecha actual:
SELECT DATEADD(year,1,GETDATE())

Juego con los milisegundos, nanosegundos y microsegundos (sacado desde MSDN):

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111'
SELECT '1 millisecond' ,DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);


Esto se puede usar, por ejemplo, para saber cuántas órdenes de trabajo fueron realizadas por un usuario la semana pasada.
Tiene muchos usos.
Para más información pueden visitar la referencia oficial: http://msdn.microsoft.com/es-es/library/ms186819.aspx
¡Chau!

domingo, 7 de octubre de 2012

Uso de PRIMARY KEY y UNIQUE

¿Cual se debe usar? Se debe usar la que más se acomode al escenario.
Algunos facts:

  • Una PRIMARY KEY debe ser UNIQUE, pero un UNIQUE no tiene por qué ser una PRIMARY KEY

  • Una PRIMARY KEY no acepta valores NULL. Un campo UNIQUE puede o no aceptar valores NULL

  • Solo puede existir una PRIMARY KEY en una tabla, pero pueden haber más de un campo UNIQUE

  • Tanto una PRIMARY KEY como un campo UNIQUE pueden ser referenciados por una FOREIGN KEY


Lo copio textual desde la documentacion:
La creación de un índice único garantiza el fracaso de cualquier intento de duplicar valores de clave. No existen diferencias significativas entre crear una restricción UNIQUE y crear un índice único que es independiente de una restricción. La validación de datos se produce de igual modo y el optimizador de consultas no distingue entre un índice único creado mediante una restricción o creado manualmente. Sin embargo, debe crearse una restricción UNIQUE en la columna cuando el objetivo es la integridad de los datos. Esto deja claro el objetivo del índice.


Creo que mejor explicación no tiene :)

sábado, 6 de octubre de 2012

Diferencia entre GRANT y WITH GRANT OPTION

Para conceder permisos sobre objetos a usuarios o roles en una base de datos, es necesario usar la instruccion GRANT.
Por ejemplo, para concederle permiso de SELECT al usuario pepito sobre la tabla cliente lo hacemos así:
GRANT SELECT ON cliente TO pepito
Pero si queremos que pepito le pueda otorgar el mismo privilegio de SELECT a otros usuarios, usamos WITH GRANT OPTION
:
GRANT SELECT ON cliente TO pepito WITH GRANT OPTION

Para resumir: GRANT se utiliza para otorgrar privilegios sobre objetos a usuarios y roles. WITH GRANT OPTION se utiliza para que el mismo usuario pueda otorgrar el mismo privilegio sobre el mismo objeto a otros usuarios o roles.

¡Chau!

lunes, 1 de octubre de 2012

Manipular un identity de una columna con dbcc checkident

En este artículo chiquitito les contaré como manipular el valor de un campo con identity.

Hay una instrucción en T-SQL que se llama dbcc checkident  que sirve para manipular campos con identity, entre otras cosas, puede servir para resetear el contador (de una forma parecida que truncate, pero sin borrar datos).

Para este ejemplo, crearemos una tabla:


CREATE TABLE MiTable
(
id INT IDENTITY(1,1) NOT NULL,
fecha DATETIME NOT NULL
)


E insertaremos 3 valores

INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())


Chequearemos con dbcc checkident el ultimo valor generado:
dbcc checkident('MiTabla',NORESEED)
Y debiera entregar algo más o menos así:



Checking identity information: current identity value '3', current column value '3'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.


Bien, sabemos el último elemento insertado es el 3 y el próximo será el 4. ¿Cómo lo hacemos para que el próximo elemento sea el 20? Fácil:
dbcc checkident('MiTabla',RESEED,19)
Debiera decir algo así:



Checking identity information: current identity value '3'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.



Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id DESC
Vemos que el id es 20.

Tomen nota que se toma el numero anterior al valor que queremos que se genere cuando se indica con dbcc checkident.

También funciona con valores negativos:
dbcc checkident('MiTabla',RESEED,-19)
Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id ASC
Vemos que el id es -18.

¡Chau!