¡Descubre el Secreto de la Edad en SQL Server! Calcula Edades en un Parpadeo

¿Te has preguntado alguna vez cómo calcular la edad de forma rápida y eficiente utilizando SQL Server? ¡No busques más! En este breve tutorial, te revelaremos un forma fácil para obtener la edad de tus datos con solo unos pocos pasos en SQL Server.

La clave para calcular la edad radica en la función DATEDIFF y algunos trucos astutos. Para empezar, necesitarás la fecha de nacimiento de tus usuarios o clientes. Luego, con un simple cálculo, podrás mostrar la edad en años de manera precisa.

Sin embargo, solo utilizando la función DateDiff tendríamos inconvenientes, solo resta los años no tiene en cuenta el mes y el día.

¿Cómo lo Solucionamos?

 El siguiente código utiliza la función DateDiff y me ha funcionado mucho

Select DATEDIFF(YEAR,Convert(datetime, '22/01/1980',103),GETDATE())-
			(CASE  WHEN DATEADD(YY,DATEDIFF(YEAR,Convert(datetime,'22/01/1980',103),GETDATE()),
					Convert(datetime,'22/01/1980',103))>GETDATE() THEN 1
				ELSE 0  End) as Edad

Pero existe este otro código, que me gusta y funciona de maravilla:

Select Floor((cast(convert(varchar(8),getdate(),112) as int)-
	Cast(convert(varchar(8),Convert(datetime,'22/01/1980',103),112) as int) ) / 10000) as Edad 

Para este último ejemplo; convertimos la fecha como una cadena pegada (22011980), esto lo restamos, luego dividimos entre 10000 y finalmente redondeamos con la función Sql floor.

Share:

Como buscar procedimiento almacenado si esta programado como Job

A continuacion podemos ver como buscar un procedimiento almacenado en Sql Server si esta programado como Job:

select sj.*
from msdb.dbo.sysjobs sj
inner join msdb.dbo.sysjobsteps sjs on sj.job_id = sjs.job_id
inner join msdb.dbo.sysjobschedules sjsc on sjs.job_id = sjsc.job_id
where sjs.command like'%Nombreprocedimientoalmacenado%'
Share:

Como Calcular de forma facil, la edad en años meses y dias en Sql

Una manera fácil y sencilla de obtener la edad de una persona en términos de Año, mes o día en Sql Server, se puede realizar a partir del siguiente ejemplo:

Declare @FechaNacimiento datetime
Set @FechaNacimiento = '05/16/2011'
Select Convert(Integer, Datediff(Day, @FechaNacimiento, Getdate())/365.25)EdadAños,
 Convert(Integer, Datediff(Day, @FechaNacimiento, Getdate())/30)EdadMeses,
 Convert(Integer, Datediff(Day, @FechaNacimiento, Getdate()))EdadDias 

El resultado de la ejecución anterior seria lo siguiente:


Analizando un poco el ejemplo anterior, lo que se hace es declarar una variable que almacena la fecha de nacimiento, luego ésta es pasada a cada una de las instrucciones Sql que consulta la edad en años, Meses y días.

Leer Mas:

Los invito ha consultar el código que nos permite obtener el tamaño de las tablas de una Base de datos Sql.
Share:

Conocer el tamaño de las tablas de una Base de Datos Sql

En ocasiones nos vemos en la necesidad de conocer el tamaño de las tablas de una base de datos Sql y saber cuales están ocupando mas espacio en ella, es de vital importancia para una buena administración de los datos y el servidor. Una opción es consultar las propiedades tabla por tabla pero esto puede llegar a hacer ineficiente cuando tenemos muchas tablas. Lo mejor es ejecutar el siguiente script en nuestra base de datos devolviendo ordenadamente que tabla tiene mayor tamaño por el numero de registros e indices que tiene.
Use BaseDatos
Go
SET NOCOUNT ON 

/************OBTENER EL TAMAÑO DE LAS TABLAS DE UNA BASE DE DATOS********/

/**********************************************************
 Corrige las filas, las páginas utilizadas, las páginas 
 reservadas, las páginas hoja y las páginas de datos de 
 cuenta para cada partición en una tabla o índice.
***********************************************************/
DBCC UPDATEUSAGE(0) 


create TABLE #TablesBD 
(
    [name] NVARCHAR(128),
    [rows] CHAR(11),
    reserved VARCHAR(18),
    data VARCHAR(18),
    index_size VARCHAR(18),
    unused VARCHAR(18)
)

INSERT #TablesBD EXEC sp_msForEachTable 'EXEC sp_spaceused ''?''' 

--CONSULTA EL RESULTADO ORDENANDO POR LA TABLA MAS PESADA
SELECT *
FROM   #TablesBD
ORDER BY convert(int, substring(data, 1, len(data)-3)) desc

Los invito a consultar como se calcula la edad en años, meses y días en Sql.

"" Si tienes dudas o quieras ampliar este artículo, lo puedes hacer dejando tus comentarios. Además, si lo consideras interesante puedes compartirlo con amigos y seguidores a través de los botones sociales que aparecen en esta página.""

Share:

Parámetros OUTPUT en procedimientos almacenados

A continuación podemos ver un pequeño ejemplo en Sql Server de como crear un procedimiento almacenado (SP) con la declaración de parámetros entre estos uno de salida (Output), finalmente se muestra la ejecución del SP y retorna el resultado de la variable Output.

--Crear Procedimiento almacenado
create procedure spdeprueba
 @parametro1  int
 ,@parametro2 int
 ,@resultado  int output --variable de salida
As
begin
 set @respuesta = @parametro1 + @parametro2
end
go

--Ejecutar el procedimiento almacenado e imprimir la variable output
Declare @resultado int

Execute spdeprueba 1,2, @resultado output

Select @resultado
"" Si tienes dudas o quieras ampliar este artículo, lo puedes hacer dejando tus comentarios. Además, si lo consideras interesante puedes compartirlo con amigos y seguidores a través de los botones sociales que aparecen en esta página.""
Share:

Procedimiento almacenado programado en Job

Buscar en Sql Server un procedimiento almacenado que se encuentre programado en un JOB (dentro de sus pasos de ejecución) muchas veces puede llegar a ser necesario.

En el siguiente código Sql pueden ver como se puede obtener a partir del nombre o las iniciales de procedimiento almacenado el nombre, fecha de creación y modificación, ultima fecha de creación, entre otros.

Select sj.name,sj.description,sj.date_created,sj.date_modified,sjs.command,sjs.last_run_duration,sjs.last_run_date,last_run_time,
  sjsc.next_run_date,next_run_time
From msdb.dbo.sysjobs sj
 Inner join msdb.dbo.sysjobsteps sjs 
On sj.job_id = sjs.job_id
 Inner join msdb.dbo.sysjobschedules sjsc 
On sjs.job_id = sjsc.job_id
where sjs.command Like'%paDCProcesoDiario%'




Share:

SQL Integration Services - SSIS: Contenedor de bucles Foreach

El contenedor de bucles Foreach define un flujo de control que se repite en un paquete. Este es un componente definido en el SSIS (SQL Server Integration Services). La ejecución del bucle en el contendor For Each es similar al bucle Foreach de varios lenguajes de programación conocidos.

Existen diferentes tipos de enumeradores disponibles que son:

* Enumerador de archivos para Foreach
El enumerador de archivos enumera los archivos en una carpeta. Por ejemplo, podemos obtener todos los archivos que tienen la extensión *. Txt en una carpeta de Windows y sus subcarpetas.

* Enumerador ADO para Foreach
Permite enumerar las filas de una tabla. Por ejemplo, podemos obtener las filas de los registros ADO.

* Enumerador de conjunto de filas del esquema Foreach de ADO.Net
El enumerador ADO.Net enumera la información del esquema. Por ejemplo, podemos obtener la una lista de tablas de la base de datos.

* Enumerador de elementos para Foreach
Utilizado para enumerar elementos que son colecciones. Por ejemplo, podemos enumerar los nombres de los ejecutables y directorios de trabajo que utiliza una tarea Ejecutar proceso.

* Enumerador de lista de nodos para Foreach
La lista de nodos que permite Enumera el resultado de una expresión XPath.

* Enumerador de variable para Foreach
El enumerador de variable enumera los objetos que contienen variables especificadas. Aquí los objetos enumerador no son más que una matriz o tabla de datos, como por ejemplo un DataSet de ADO.Net

* Enumerador de SMO para Foreach
El enumerador de SMO enumera los objetos de administración de SQL Server (SMO). Por ejemplo, se puede obtener la lista de funciones o vistas de una base de datos SQL Server.

Para este ejemplo utilizaremos el enumerador de archivos Foreach, vamos a copiar los archivos que se encuentran en una carpeta Origen (C:\Origen) a una carpeta Destino (D:\Destino).

Business Intelligence ProjectsPrimero abrimos el Visual Studio y creamos un proyecto Business Intelligence - Integración de
servicios como lo muestra la siguiente imagen.


Después de crear el proyecto de integración de servicios cambiamos el nombre por defecto de la Dtsx package1, para este ejemplo podemos poner ExampleForeach.

Solution Explorer

Seguidamente empezamos agregando una variable a nuestro paquete ExampleForeach, damos clic derecho sobre el modo de diseño y en el menú damos clic sobre Variables.


Luego nos aparece una ventana que nos permite Agregar la variable.



Aquí añadimos como nombre de variable File, tipo de datos String y value o valor default.



Ya configurada nuestra variable, procedemos arrastrar el contenedor de bucles ForEach que se encuentra en la caja de herramientas al formulario.

Quedando el contenedor bucle Foreach en modo diseño de la siguiente forma:


Para configurar nuestro control seguiremos los siguientes pasos:

1. Dar doble clic en el cuadro contenedor de bucle o clic derecho Edit. 
2. Luego se muestra una ventana para editar el bucle Foreach.
3. En esta ventana en el menu Collection seleccionamos en tipo enumerador, Enumerador de archivos.
4. Establecemos la carpeta Origen en la sección configuración de Enumeración. Para este ejemplo he dejado la ruta D:\Docs 
5. Si lo deseamos, marcamos la casilla de verificación Traverse Subcarpetas.

Si seguimos los pasos anteriores tendremos una configuración como lo muestra la siguiente imagen:


En la misma ventana, seleccionamos del menú izquierdo la opción Variable Mappings aquí seleccionamos la variable que habiamos creado.
Finalmente damos clic en Aceptar. 
En este punto ya tenemos configurado nuestro contenedor de bucles ForEach. Ahora agregamos un control File System Task a nuestro contenedor de bucles Foreach, debe quedar como se muestra en la imagen.

Foreach Loop Container

Para configurar seguimos los siguientes pasos:

1. Dar doble clic en el cuadro File System Task o clic derecho Edit.
2. En la ventana establecer IsDestinationPathVariable en False.
3. Configuramos la conexión destino, en la propiedad DestinationConnection. 
4. Seleccionamos la opción de nueva conexión.


5. En la ventana que aparece seleccionamos "Carpeta existente" o Existing folder.
6. Seguidamente, seleccionamos la carpeta de destino mediante "Examinar". Para este ejemplo seleccionamos D:\Destino

Dar clic en Ok para continuar la configuración.

7. Luego Seleccionamos la Operación, para este caso es Copiar archivos o Copy file.
8. Cambiamos a True la propiedad IsSourcePathVariable y seleccionamos la opción SourceVariable User::File

Quedando la parametrización para nuestro control de la siguente forma:


En la ventana damos clic en Ok. Ejecutamos nuestro proyecto (F5) y si todo nos sale bien debemos ver una imagen como la siguiente, además de verificar si los archivos fueron copiados de acuerdo a las rutas configuradas como Origen y Destino.


"" Si tienes dudas o quieras ampliar este artículo, lo puedes hacer dejando tus comentarios. Además, si lo consideras interesante puedes compartirlo con amigos y seguidores a través de los botones sociales que aparecen en esta página.""

Share:

Obtener Día, Mes y Año en SQL Server

A través del siguiente código SQL, podemos obtener de un forma rápida el día, mes y año de una fecha.

Cómo separar una fecha por dia mes y año en sql

Una forma sencilla de separar el día, mes y año de una fecha en sql, es a travez de las funciones DateName y DatePart.

El código esta comentado línea a línea, si tienen algún comentario o sugerencia al mismo me escriben.
Declare @Fecha Datetime,
     @Dia Varchar(2),
     @Mes Varchar(12),
     @Ano Varchar(4)
  
--Guardamos en variable el día de hoy
Set @Fecha = Getdate()

--Establecemos idioma para retornar el formato de la fecha - para este caso español
Set Language spanish

--Retornamos el dia, mes y año de la fecha
Set @Dia = Datepart(dd,convert(datetime,@Fecha,103)) 
Set @Mes = DateName(mm,convert(datetime,@Fecha,103))
Set @Ano = Datepart(yy,convert(datetime,@Fecha,103))

--Establecemos el lenguaje original
Set Language English

--Retornamos variables con los datos
Select @Dia Dia,@Mes Mes,@Ano Año
El resultado seria el siguiente:

Fecha SQL
Leer Mas:

Si queremos consultar el lenguaje configurado en le servidor de base de datos, lo podemos conocer a través de la siguiente instrucción:
select @@LANGUAGE Lenguaje
"" Si tienes dudas o quieras ampliar este artículo, lo puedes hacer dejando tus comentarios. Además, si lo consideras interesante puedes compartirlo con amigos y seguidores a través de los botones sociales que aparecen en esta página.""

Share:

Inicializar campo IDENTITY

Para inicializar columnas IDENTITY se pueden utilizar las siguientes 2 opciones:

1. Una opción es a través de la instrucción Sql TRUNCATE TABLE, además de borrar el contenido de la tabla inicializa el valor del campo IDENTITY.

Ejemplo:
TRUNCATE TABLE tbIdentiy

2. La segunda es usando el comando DBCC CHECKIDENT.

Esta instrucción permite resetear el valor que queremos del campo Identity, así:

DBCC CHECKIDENT (tbIdentiy,RESEED,1)

Tener cuidado con el uso de este comando, ya que podemos resetear un valor menor al máximo de la tabla y crear en algún momento un valor duplicado.
"" Si tienes dudas o quieras ampliar este artículo, lo puedes hacer dejando tus comentarios. Además, si lo consideras interesante puedes compartirlo con amigos y seguidores a través de los botones sociales que aparecen en esta página.""
Share:

Como Crear de forma fácil Columna Identity en SQL Server

El atributo Identity puede ser utilizado al crear tablas con campos numéricos (int,smallint, bigint, y tinyint), en sentencias Create Table y Alter Table.

Pero como crear de forma fácil una Columna Identity?, antes de saber Como, debe entender que en que consiste.

Es aquella columna que nos permite generar valores secuenciales e incrementables automáticamente cada vez que se inserta un nuevo registro en una tabla, Sql se encarga de asignarle el valor numérico correspondiente a la columna.

Veamos como funciona, creando una tabla con una columna IDENTITY:

CREATE TABLE tbIdentiy 
(
Id Int NOT NULL IDENTITY(1,1) PRIMARY KEY,
Descripcion Varchar(20) NOT NULL 
)
Go

Podemos observar en el anterior script, que la columna identidad (id) es entera, no se permiten valores nulos (NOT NULL)  esta parametrizada como IDENTITY(1,1), esto significa que inicia en 1 y se incrementa de 1 en 1, además la columna la establecemos como llave primaria (PRIMARY KEY), no es necesario, pero es recomendable establecer como llave primaria a este tipo de columnas.

Con la tabla ya creada, veamos como insertamos los datos:

Insert Into tbIdentiy(Id,Descripcion) Values(1,'Vb.Net')
Go


Ejecutando la anterior sentencia sql nos genera un error, ya que estamos estableciendo el valor 1 a la columna IDENTITY.


Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for IDENTITY column in table 'tbIdentiy' when IDENTITY_INSERT is set to OFF.

Ejecutemos la sentencia, pero sin incluir la columna Id

Insert Into tbIdentiy(Descripcion) Values('Vb.Net')
Go
(1 row(s) affected)

La ejecución fue satisfactoria, consultando la tabla

Select Id,Descripcion From Dbo.tbIdentiy


Si insertamos mas registros en la tabla:

Insert Into tbIdentiy(Descripcion) Values('C#')
Go
Insert Into tbIdentiy(Descripcion) Values('Sql Server')
Go

Identity 3 Rows






Nos damos cuenta, que por cada inserción en la tabla, Sql incrementa automáticamente la columna Id y esto es por el atributo IDENTITY.

Como recomendación anexo post que nos permite Inicializar un campo IDENTITY.

Espero les sirva esta documentación, hasta pronto.
Share:

IsNull en Oracle


NVL OracleEn las consultas a base de datos los resultados pueden traernos valores Nulos (Null) para evitar esto, en SQL la función se llama IsNull en Oracle es llamada NVL, veamos como se usan:







Oracle NVL

nvl(check_expression,replacement_value)

SQL IsNull

IsNull(check_expression,replacement_value)

En ambos casos las funciones reemplazan el valor nulo (check_expression) por el que se encuentre en segundo parámetro replacement_value.
Share:

Comparación Detallada entre SCOPE_IDENTITY() y @@IDENTITY para Optimizar tus Consultas

En el mundo de SQL Server, las funciones SCOPE_IDENTITY() y @@IDENTITY desempeñan roles cruciales al recuperar valores de identidad generados durante la inserción de registros en una tabla. Aunque ambas funciones están diseñadas para propósitos similares, existen diferencias clave que es vital comprender.

1. Alcance de la Función:

  • SCOPE_IDENTITY(): Se limita al alcance de la rutina actual, lo que significa que devuelve el último valor de identidad generado dentro del mismo ámbito o bloque de instrucciones T-SQL que realizó la inserción.
  • @@IDENTITY: Es más amplio en alcance y puede devolver el último valor de identidad generado en cualquier ámbito, incluso si es diferente al ámbito actual. Esto lo hace más propenso a errores si se ejecutan múltiples operaciones de inserción simultáneas en diferentes ámbitos.

2. Manejo de Desencadenadores (Triggers):

  • SCOPE_IDENTITY(): Es más seguro en entornos que involucran desencadenadores, ya que solo devuelve el valor de identidad generado en el ámbito actual, evitando conflictos causados por desencadenadores en otros ámbitos.
  • @@IDENTITY: Puede ser afectado por desencadenadores en otros ámbitos, ya que puede devolver el valor de identidad generado más recientemente, incluso si fue causado por una operación en un ámbito diferente.
3. Funciones de Tabla:

  • SCOPE_IDENTITY(): Es preferible cuando se trabaja con funciones de tabla, ya que se comporta de manera más predecible y devuelve el valor de identidad de la tabla específica en la que se realizó la inserción.
  • @@IDENTITY: Puede devolver el valor de identidad de cualquier tabla, lo que puede resultar en comportamientos inesperados en el caso de operaciones simultáneas en múltiples tablas.
Ambas funciones devuelven el id de la última fila insertada en columnas de identidad, a continuación se describen en que consisten:

* @@identity: Devuelve el valor de identidad de una tabla en la sesión actual. Si se inserta una fila en la tabla A, se inserta una fila en la tabla B, y seleccione @@IDENTITY, obtendrá el valor de identidad insertado en la Tabla B.

create table tableA (
                               ID1 int identity(1,1),
                               Detalle varchar(100)
                )
create table tableB (
                               ID1 int identity(20,1),
                               Detalle varchar(100)
                )
Insert Into tableA Values ('Detalle1')
Insert Into tableB Values ('Detalle2')

Select @@IDENTITY       -- resultado 20

Ahora si realizamos la inserción en una tabla pero ésta tiene un trigger que inserta registros en una segunda tabla, la función retornara el Id de la última tabla y no de la que inicialmente estabas insertando.

* SCOPE_IDENTITY():  Retorna el último valor de identidad generado para cualquier tabla, no sólo en la sesión actual sino también en el ámbito actual (es un modulo como procedimiento almacenado, trigger, funciones). Es la mejor opción para solucionar un escenario como lo expuesto anteriormente, ya que devuelve así sea que la tabla donde se inserte tenga trigger, el último Id del último Scope utilizado.


En resumen, SCOPE_IDENTITY() es más preciso y seguro en situaciones donde el alcance debe ser estrictamente controlado, mientras que @@IDENTITY es más versátil pero potencialmente propenso a errores en entornos más complejos. La elección entre ambas dependerá de las necesidades específicas de la aplicación y del control del alcance requerido.
Share: