Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas

jueves, 9 de junio de 2016

QuerySets con Python3

Los pasos para llegar a la consola donde vamos a ejecutar los querysets son los siguientes:
  1. Activar el entorno virtual: source appsEnv/bin/activate
  2. Llamar a la shell de python: python3.4 manage.py shell
  3. importar los modelos que queremos trabajar: from appejemplo.models import *
Ya con esto estaremos listos a ejecutar las sentencias que nos traeran la información solicitada.

  • Para consultar todos los registros de un modelo: >>> Post.objects.all()
  • Consultar un registro filtrandolo por una propiedad: me = User.objects.get(username='pepito')
  •  Consultar todos los registros que concuerden con una condición, la cual puede devolver uno o muchos registros: Post.objects.filter(author='pepito')
  •  Filtrar todos los registros que contengan una palabra: >>>Post.objects.filter(title__contains='Millonario')

 FECHAS

Ahora vamos a realizar operaciones con fechas.
  • Consultar todos los registros que tienen un campo tipo fecha en el pasado:
    • >>> from django.utils import timezone
    • >>> Post.objects.filter(published_date__lte=timezone.now())
la parte de lte= significa <= y la parte de gte= significa >=
  • Pare realizar varios filtros al mismo tiempo:
    • >>> list_movements = MovMotionAccount.objects.filter(motionAccountDate__lte='2016-04-30 23:59:59').filter(motionAccountDate__gte='2016-04-01 00:00:00')
  •  
 ORDENACIÓN
Ahora vamos a realizar consultas ordenando la información. 
  • Consultamos la información y ordenamos por un campo tipo fecha:
    • >>> Post.objects.order_by('created_date')
  • Invirtiendo el ordenamiento:
    • >>> Post.objects.order_by('-created_date')

sábado, 23 de agosto de 2014

Comandos en Gestores de Bases de Datos

  • SQL SERVER
Para modificar el nombre de una tabla se ejecuta la siguiente consulta:
EXEC sp_rename 'nom_tabla_antiguo', 'nom_tabla_nueva'
 
Para modificar el nombre de una columna de una tabla, se ejecuta la siguiente consulta:
EXEC sp_rename 'nom_tabla.nom_columna_antigua', 'nom_columna_nueva'
 
Para consultar los nombres de las columnas en una tabla:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME= "Nombre Tabla" 
  • ORACLE 
Para consultar los nombres de las columnas en una tabla:
DESC "Nombre Tabla"
  • INFORMIX
Para consultar los nombres de las columnas en una tabla: 
DESC "Nombre Tabla"

miércoles, 26 de febrero de 2014

Manejo de Secuencias


  • Consultamos la secuencia de una tabla de oracle

long? sequenceOracle = db.GetAutonumeric("sq_nombreTabla_sec", transaction);


  • Cuando el campo ID es autonumérico, y en uno de los ejemplos, se utiliza la variable @@Identity de SQL Server para saber cuál ese el valor de ese campo al añadir un nuevo dato.

long sequence = long.Parse(db.ExecuteScalar("SELECT @@Identity").ToStringValue());

sábado, 1 de febrero de 2014

Sentencias SQL

Con esta sentencia se puede conocer cuales instancias de base de datos se tiene en un servidor.

ORACLE 

select * from all_users;

Modificar una tabla (ALTER TABLE)

SQL SERVER
CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO

viernes, 1 de marzo de 2013

Solucionar Bloqueos en Tablas SQL Server


Resulta que cuando una tabla es muy utilizada (muchas consultas), o cuando se “cruzan” las transacciones sobre la misma tabla, se produce un bloqueo a nivel de tabla, lo que hace que ya no se puedan realizar más consultas. 
Según lo que leí (inicialmente en blog.andr3z.org y luego en otros lugares), existen 2 posibles soluciones al problema:
  •  Modificar la consulta para saltarnos el bloqueo
  • Intentar resolver el bloqueo de la tabla

Cada solución tiene su propio alcance, sus pros y contras, veamos cada solución en detalle:

  • Solución 1: Modificar la consulta para “saltar” el bloqueo:


    Ámbito: No se desbloquea la tabla, solo se devuelven los resultados

    Pros: Permite realizar el SELECT sin restricción.

Contras: Puede retornar resultados fuera del Committed de la base de datos (es decir que los resultados pueden no ser fidedignos)

Para implementar esta solución, basta modificar el SELECT de la consulta, agregando el modificador WITH (NOLOCK), lo que hará que se omita el bloqueo de la tabla:

SELECT Field1, Field2,… FieldN FROM [Mi_Tabla] WITH (NOLOCK) WHERE …

  • Solución 2: Intentar resolver el bloqueo de la tabla:

    Ámbito: Se intenta resolver el bloqueo.
Pros: Se resuelve definitivamente el bloqueo (por lo menos hasta que se vuelva a producir un bloqueo nuevo en la misma tabla)

    Contras: Requiere tener acceso/permisos para “Matar” procesos (incluso de otros usuarios).

Para esta solución, SQL server provee un procedimiento almacenado que muestra los bloqueos en curso: sp_lock.

Basta con ejecutar:

Execute sp_lock

Para ver los bloqueos activos en la base de datos.

Cabe mencionar que adicionalmente SQL Server también provee 2 procedimientos que permiten listar los procesos que están consumiendo muchos recursos: sp_who o sp_who2 siendo este último el que provee más detalles.

Una vez se ha identificado cual es el proceso que esta provocando el bloqueo, se puede proceder a “Matar” dicho proceso utilizando la información que arrojan los procedimientos ya mencionados (básicamente se requiere el ID del proceso que se va a matar).

Ejecutar: 

Kill <id_del_proceso_a_matar>

Bueno, pues eso era todo, como siempre, espero que esta información llegue a ser útil para alguno de ustedes.

Fuente: eklectopia

jueves, 28 de febrero de 2013

Configuracion Conexiones Workbench


Para realizar las diferentes configuraciones para el gestor de bases de datos Workbench, realizamos los siguientes pasos dependiendo del motor de bases de datos:

SQL SERVER


  • Para crear una conexión en el Workbench, debemos crear primero una conexión ODBC, donde ingresamos todos los datos correspondientes a la base de datos.
  • Luego en la interface de configuración de las conexiones del Workbench, configuramos la conexión como vemos a continuación:


















Ya con todas estas configuraciones bien realizadas, es muy posible que no existan problemas con la conexión.

ORACLE

[Configuracion]

INFORMIX

[Configuracion]

jueves, 7 de febrero de 2013

Niveles de Aislamiento


A continuación se describen los cuatro posibles niveles de aislamiento basados en bloqueos.

1. READ UNCOMMITTED
Puede recuperar datos modificados pero no confirmados por otras transacciones ( lecturas sucias - dirty reads ). En este nivel se pueden producir todos los efectos secundarios de simultaneidad (lecturas sucias, lecturas no repetibles y lecturas fantasma - ej: entre dos lecturas de un mismo registro en una transacción A, otra transacción B puede modificar dicho registro), pero no hay bloqueos ni versiones de lectura, por lo que se minimiza la sobrecarga. Una operación de lectura (SELECT) no establecerá bloqueos compartidos (shared locks) sobre los datos que está leyendo, por lo que no será bloqueada por otra transacción que tenga establecido un bloqueo exclusivo por motivo de una operación de escritura. Este nivel de aislamiento ofrece grandes beneficios de rendimiento, pero sólo deberemos utilizarlo en aquellos casos en que la ocurrencia de lecturas sucias (dirty reads) no sea un problema.

2. READ COMMITTED 
Permite que entre dos lecturas de un mismo registro en una transacción A, otra transacción B pueda modificar dicho registro, obteniendose diferentes resultados de la misma lectura. Evita las lecturas sucias (dirty reads), pero por el contrario, permite lecturas no repetibles. Es la opción por defecto en SQL Server 2000 y SQL Server 2005 . Con este nivel de aislamiento, una operación de lectura (SELECT) establecerá bloqueos compartidos (shared locks) sobre los datos que está leyendo . Sin embargo, dichos bloqueos compartidos finalizarán junto con la propia operación de lectura, de tal modo que entre dos lecturas cabe la posibilidad de que otra transacción realice una operación de escritura (ej: UPDATE), en cuyo caso, la segunda lectura obtendrá datos distintos a la primera lectura (lecturas no repetibles).

3. REPEATABLE READ 
Evita que entre dos lecturas de un mismo registro en una transacción A, otra transacción B pueda modificar dicho registro, con el efecto de que en la segunda lectura de la transacción A se obtuviera un dato diferente. De este modo, ambas lecturas serían iguales (lecturas repetidas). Para ello, una operación de lectura (SELECT) establecerá bloqueos compartidos (shared locks) sobre los datos que está leyendo, y los mantendrá hasta el final de la transacción , garantizando así que no se produce lecturas no repetibles (non repeatable reads) . Mayor consistencia en la transacción, mediante mayores recursos y bloqueos ( se evitan los problemas de las lecturas sucias y de las lecturas no repetibles , pagando el precio de necesidad de mayores recursos). Sin embargo, este modo de aislamiento no evita las lecturas fantasma , es decir, una transacción podría ejecutar una consulta sobre un rango de filas (ej: 100 filas) y de forma simultánea otra transacción podría realizar un inserción de una o varias filas sobre el mismo rango.

4. SERIALIZABLE 
Garantiza que una transacción recuperará exactamente los mismos datos cada vez que repita una operación de lectura (es decir, la misma sentencia SELECT con la misma cláusula WHERE devolverá el mismo número de filas, luego no se podrán insertar filas nuevas en el rango cubierto por la WHERE, etc. - se evitarán las lecturas fantasma ), aunque para ello aplicará un nivel de bloqueo que puede afectar a los demás usuarios en los sistemas multiusuario (realizará un bloqueo de un rango de índice - conforme a la cláusula WHERE - y si no es posible bloqueará toda la tabla). Evita los problemas de las lecturas sucias (dirty reads), de las lecturas no repetibles (non repeatable reads), y de las lecturas fantasma (phantom reads).

Saber más: Niveles de Aislamiento y bloqueos

martes, 5 de febrero de 2013

Resetear secuencias en tablas de SQL Server

Para resetear una secuencia de una tabla en la base de datos de SQL Server de Microsoft, utilizamos las siguientes instrucciones:
DBCC CHECKIDENT('nombre_tabla',RESEED,0)

Para saber el consecutivo de la secuencia
DBCC CHECKIDENT('nombre_tabla')

sábado, 3 de noviembre de 2012

Despendencias en SQL Server


Ver las dependencias en SQL Server (programación)

Podemos ver las dependencias de una tabla, utilizando la siguiente consulta:

SELECT routine_name, routine_type FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%MinorCategory%'

martes, 2 de octubre de 2012

Seleccionar un rango de datos

INFORMIX
En informix para obtener los primeros 10 registros de una consulta, debemos usar FIRST.
Ejemplo: Select FIRST 10 columna1, columna2 from facturas.

SQL Server
En SQL el Top
Ejemplo: Select TOP(10 ) columna1, columna2 from facturas.

ORACLE
En Oracle es rownum.
Ejemplo: Select * from nomTabla where rownum <= 1

jueves, 30 de agosto de 2012

Usuarios y privilegios en Oracle

1. Crear Usuarios y asignar privilegios en Oracle
El siguiente es un resumen de algunas consideraciones al momento de crear un usuario o cuenta en Oracle, y los privilegios y roles que le podemos asignar.
  • El nombre de usuario no debe superar 30 caracteres, no debe tener caracteres especiales y debe iniciar con una letra.
  • Un método de autentificación. El mas común es una clave o password, pero Oracle 10g soporta otros métodos (como biometric, certificado y autentificación por medio de token).
  • Un Tablespace default, el cual es donde el usuario va a poder crear sus objetos por defecto, sin embargo, esto no significa que pueda crear objetos, o que tenga una cuota de espacio. Estos permisos se asignan de forma separada, salvo si utiliza el privilegio RESOURCE el que asigna una quota unlimited, incluso en el Tablespace SYSTEM!  Sin embargo si esto ocurre, ud. puede posteriormente mover los objetos creados en  el SYSTEM a otro Tablespace.
  • Un Tablespace temporal, donde el usuario crea sus objetos temporales y hace los sort u ordenamientos.
  • Un perfil o profile de usuario, que son las restricciones que puede tener su cuenta (opcional).
Por ejemplo, conectado como el usuario SYS, creamos un usuario y su clave asi:
SQL> CREATE USER ahernandez IDENTIFIED BY ahz
         DEFAULT TABLESPACE users;
Si no se indica un Tablespace por defecto, el usuario toma el que está definido en la BD (generalmente el SYSTEM). Para modificar el Tablespace default de un usuario se hace de la siguiente manera:
SQL> ALTER USER jperez DEFAULT TABLESPACE datos;
También podemos asignar a los usuarios un Tablespace temporal donde se almacenan operaciones de ordenamiento. Estas incluyen las cláusulas ORDER BY, GROUP BY, SELECT DISTINCT, MERGE JOIN, o CREATE INDEX (también es utilizado cuando se crean Tablas temporales).
SQL> CREATE USER jperez IDENTIFIED BY jpz
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
Adicionalmente,  a cada usuario se puede asignar a un profile o perfil, que tiene dos propósitos principalmente:
  • Limita el uso de recursos,  lo que es recomendable, por ejemplo en ambientes de Desarrollo
  • Garantiza y refuerza reglas de Seguridad a nivel de cuentas
Ejemplos, cuando se crea el usuario o asignar un perfil existente:
SQL> CREATE USER jperez IDENTIFIED BY jpz
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
PROFILE resource_profile;
SQL> ALTER USER jperez
PROFILE perfil_desa;
2. Eliminar un Usuario de la Base de Datos
Para eliminar un usuario de la BD se hace uso de la clausula DROP USER y opcionalmente se puede utilizar CASCADE, para decirle que también elimine todos los objetos creados por ese usuario.
SQL> DROP USER jperez CASCADE;
3. Modificar cuentas de Usuarios
Para modificar un usuario creado, por ejemplo cambiar su clave, tenemos la sintáxis:
SQL> ALTER USER NOMBRE_USUARIO
 IDENTIFIED BY CLAVE_ACCESO
[DEFAULT TABLESPACE ESPACIO_TABLA]
[TEMPORARY TABLESPACE ESPACIO_TABLA]
[QUOTA {ENTERO {K | M } | UNLIMITED } ON ESPACIO_TABLA
[PROFILE PERFIL];
4. Privilegios de Sistema y de Objetos
En Oracle existen dos tipos de privilegios de usuario.
4.1 System: Que permite al usuario hacer ciertas tareas sobre la BD, como por ejemplo crear un Tablespace. Estos permisos son otorgados por el administrador o por alguien que haya recibido el permiso para administrar ese tipo de privilegio. Existen como 100 tipos distintos de privilegios de este tipo.
En general los permisos de sistema, permiten ejecutar comandos del tipo DDL (Data definition Language), como CREATE, ALTER y DROP o del tipo DML (Data Manipulation Language). Oracle 10g tiene mas de 170 privilegios de sistema los cuales pueden ser vistos consultando la vista: SYSTEM_PRIVILEGE_MAP
Entre todos los privilegios de sistema que existen, hay dos que son los importantes: SYSDBA y SYSOPER. Estos son dados a otros usuarios que serán administradores de base de datos.
Para otorgar varios permisos a la vez, se hace de la siguiente manera:
SQL> GRANT CREATE USER, ALTER USER, DROP USER TO ahernandez;
4.2 Object: Este tipo de permiso le permite al usuario realizar ciertas acciones en objetos de la BD, como una Tabla, Vista, un Procedure o Función, etc.  Si a un usuario no se le dan estos permisos sólo puede acceder a sus propios objetos (véase USER_OBJECTS). Este tipo de permisos los da el owner o dueño del objeto, el administrador o alguien que haya recibido este permiso explícitamente (con Grant Option).
Por ejemplo, para otorgar permisos a una tabla Ventas para un usuario particular:
SQL> GRANT SELECT,INSERT,UPDATE, ON analista.venta TO jperez;
Adicionalmente, podemos restringir los DML a una columna de la tabla mencionada. Si quisieramos que este usuario pueda dar permisos sobre la tabla Factura a otros usuarios, utilizamos la cláusula WITH GRANT OPTION. Ejemplo:
SQL> GRANT SELECT,INSERT,UPDATE,DELETE ON venta TO mgarcia WITH GRANT OPTION;
5. Asignar cuotas a Usuarios
Por defecto ningun usuario tiene cuota en los Tablespaces y se tienen tres opciones para poder proveer a un usuario de una quota:
5.1Sin limite, que permite al usuario usar todo el espacio disponible de un Tablespace.
5.2 Por medio de un valor, que puede ser en kilobytes o megabytes que el usuario puede usar. Este valor puede ser mayor o nenor que el tamaño del Tablespace asignado a él.
5.3 Por medio del privilegio UNLIMITED TABLESPACE, se tiene prioridad sobre cualquier cuota dada en un Tablespace por lo que tienen disponibilidad de todo el espacio incluyendo en SYSTEM y SYSAUX.
No se recomienda dar cuotas a los usuarios en los Tablespaces SYSTEM y SYSAUX, pues tipicamente sólo los usuarios SYS y SYSTEM pueden crear objetos en éstos. Tampoco dar cuotas en los Tablespaces Temporal o del tipo Undo.
6. Roles
Finalmente los Roles, que son simplemente un conjunto de privilegios que se pueden otorgar a un usuario o a otro Rol. De esa forma se simplifica el trabajo del DBA en esta tarea.
Por default cuando creamos un usuario desde el Enterprise Manager se le asigna el permiso de connect, lo que permite al usuario conectarse a la BD y crear sus propios objetos en su propio esquema. De otra manera, debemos asignarlos en forma manual.
Para crear un Rol y asignarlo a un usuario se hace de la siguiente manera:
SQL> CREATE ROLE appl_dba;
Opcionalmente, se puede asignar una clave al Rol:
SQL> SET ROLE appl_dba IDENTIFIED BY app_pwd;
Para asignar este Rol a un usuario:
SQL> GRANT appl_dba TO jperez;
Otro uso común de los roles es asignarles privilegios a nivel de Objetos, por ejemplo en una Tabla de Facturas en donde sólo queremos que se puedan hacer Querys e Inserts:
SQL> CREATE ROLE consulta;
SQL> GRANT SELECT,INSERT on analista.factura TO consulta;
Y finalmente asignamos ese rol con este “perfil” a distintos usuarios finales:
SQL> GRANT consulta TO ahernandez;
Nota: Existen algunos roles predefinidos, tales como:
CONNECT, CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SYNONYM, CREATE SEQUENCE, CREATE DATABASE LINK, CREATE CLUSTER,
ALTER SESSION, RESOURCE, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TRIGGER, CREATE TYPE, CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR SCHEDULER, CREATE ANY JOB, CREATE JOB, EXECUTE ANY CLASS, EXECUTE ANY PROGRAM,
MANAGE SCHEDULER, etc.
DBA: Tiene la mayoría de los privilegios, no es recomendable asignarlo a usuarios que no son administradores.
SELECT_CATALOG_ROLE: No tiene privilegios de sistema, pero tiene cerca de 1600 privilegios de objeto.
Para consultar los roles definidos y los privilegios otorgados a través de ellos, utilize las vistas:
SQL> select * from DBA_ROLES;
SQL> select * from DBA_ROLE_PRIVS order by GRANTEE;
Etiquetas: ,

miércoles, 29 de agosto de 2012

Consultas en bases de datos SQL Server


Para realizar una consulta a una base de datos SQL Server, realizaremos lo siguiente como lo veremos en el ejemplo:

using System;
using System.Data;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString =
            "Data Source=(local);Initial Catalog=Northwind;"
            + "Integrated Security=true";

        // Provide the query string with a parameter placeholder.
        string queryString =
            "SELECT ProductID, UnitPrice, ProductName from dbo.products "
                + "WHERE UnitPrice > @pricePoint "
                + "ORDER BY UnitPrice DESC;";

        // Specify the parameter value.
        int paramValue = 5;

        // Create and open the connection in a using block. This
        // ensures that all resources will be closed and disposed
        // when the code exits.
        using (SqlConnection connection =
            new SqlConnection(connectionString))
        {
            // Create the Command and Parameter objects.
            SqlCommand command = new SqlCommand(queryString, connection);
            command.Parameters.AddWithValue("@pricePoint", paramValue);

            // Open the connection in a try/catch block.
            // Create and execute the DataReader, writing the result
            // set to the console window.
            try
            {
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("\t{0}\t{1}\t{2}",
                        reader[0], reader[1], reader[2]);
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

lunes, 23 de julio de 2012

Función para concatenar campos


Algunas veces es necesario combinar en forma conjunta (concatenar) los resultados de varios campos diferentes.
Cada base de datos brinda una forma para realizar esto:
 Informix: ||
Oracle: CONCAT(), ||
 SQL Server: +
 MySQL: CONCAT()
La sintaxis para CONCAT() es la siguiente: CONCAT(cad1, cad2, cad3, ...): Concatenar cad1, cad2, cad3, y cualquier otra cadena juntas.
Por favor note que la función CONCAT() de Oracle sólo permite dos argumentos – sólo dos cadenas pueden colocarse juntas al mismo tiempo utilizando esta función.
Sin embargo, es posible concatenar más de dos cadenas al mismo tiempo en Oracle utilizando '||'. Observemos algunos ejemplos.
Supongamos que tenemos la siguiente tabla:
Tabla Geography region_name store_name East Boston East New York West Los Angeles West San Diego

 Ejemplo 1:
 MySQL/Oracle: SELECT CONCAT(region_name,store_name) FROM Geography WHERE store_name = 'Boston';
 Resultado : 'EastBoston'

 Ejemplo 2:
Oracle: SELECT region_name || ' ' || store_name FROM Geography WHERE store_name = 'Boston'; Resultado : 'East Boston'

 Ejemplo 3: SQL Server: SELECT region_name + ' ' + store_name FROM Geography WHERE store_name = 'Boston';
 Resultado : 'East Boston'

FORMATO FECHA EN ORACLE


Formatos de Fecha

La función TO_CHAR(,) traduce una fecha/hora (o parte de ella) a una cadena de caracteres, y TO_DATE(,) transforma una cadena de caracteres a una fecha, hora o combinación fecha/hora. Por ejemplo, TO_DATE('02/08/2002', 'DD/MM/YYYY') daría la fecha 2 de agosto de 2002. Si suponemos que un atributo FECHA almacena esa misma fecha a las 3 de la tarde, TO_CHAR(FECHA, 'DD-MON-YYYY HH:MI AM') devolvería el string 02-AGO-2002 03:00 PM. El formato es una cadena de caracteres en la que se indica el formato siguiendo las claves que se muestran en la Tabla 2.1. Esta tabla no incluye absolutamente todos los formatos, pero sí un buen número de ellos, que deberían ser más que suficientes para un uso normal. Tabla 2.1: Formatos de fecha en Oracle Siglos y años CC Siglo SCC Siglo. Si es AC (Antes de Cristo), lleva un signo YYYY Año, formato de 4 dígitos SYYY Año, formato de 4 dígitos. Si es AC lleva un signo YY Año, formato de 2 dígitos YEAR Año, escrito en letras y en inglés (por ejemplo, 'TWO THOUSAND TWO') SYEAR Ídem, pero si es AC lleva el signo BC Antes o Después de Cristo (AC o DC) para usar con los anteriores, por ejemplo YYYY BC Meses Q Trimestre: Ene-Mar=1, Abr-Jun=2, Jul-Sep=3, Oct-Dic=4 MM Número de mes (1-12) RM Número de mes en números romanos (I-XII) MONTH Nombre del mes completo rellenado con espacios hasta 10 espacios (SEPTIEMBRE) FMMONTH Nombre del mes completo, sin espacios adicionales MON Tres primeras letras del mes: ENE, FEB,... Semanas WW Semana del año (1-52) W Semana del mes (1-5) Días DDD Día del año (1-366) DD Día del mes (1-31) D Día de la semana (1-7) DAY Nombre del día de la semana rellenado a 9 espacios (MIÉRCOLES) FMDAY Nombre del día de la semana, sin espacios DY Tres primeras letras del nombre del día de la semana DDTH Día (ordinal): 7TH DDSPTH Día ordinal en palabra, en inglés: SEVENTH horas HH Hora del día (1-12) HH12 Hora del día (1-12) HH24 Hora del día (1-24) SPHH Hora del día, en palabra, inglés: SEVEN AM am o pm, para usar con HH, como 'HH:MI am' PM am o pm A.M. a.m. o p.m. P.M. a.m. o p.m. Minutos y segundos MI Minutos (0-59) SS Segundos (0-59) SSSS Segundos después de medianoche (0-86399) Además de estas palabras clave, el formato puede incluir espacios y los signos de puntuación -/,.;:. Cualquier otro carácter debe ir "entre comillas dobles". Finalmente, se debe indicar que los formatos de fecha que indican un periodo en palabras, como el nombre del mes o del día de la semana, seguirán el lenguaje de la instalación (de Oracle o del sistema operativo), por lo que no se garantiza que sea en español. Además, el uso de mayúsculas o minúsculas es significativo. Así, para el mes de agosto, MONTH produce AGOSTO , Month, Agosto , y month, agosto , y para el lunes, DY produce LUN y fmday, lunes (o su equivalente en inglés si así está configurado el idioma). Por ejemplo: SQL> select ename, 2 to_char(hiredate,'dd "de " fmmonth " de " yyyy') AS "Fecha de contrato" 3* from emp ENAME Fecha de contrato ---------- --------------------------- SMITH 17 de diciembre de 1980 ALLEN 20 de febrero de 1981 WARD 22 de febrero de 1981 JONES 02 de abril de 1981 MARTIN 28 de septiembre de 1981 BLAKE 01 de mayo de 1981 CLARK 09 de junio de 1981 SCOTT 09 de diciembre de 1982 KING 17 de noviembre de 1981 TURNER 08 de septiembre de 1981 ADAMS 12 de enero de 1983 JAMES 03 de diciembre de 1981 FORD 03 de diciembre de 1981 MILLER 23 de enero de 1982 14 filas seleccionadas.

Fechas en BD Informix

Para insertar una fecha en una consulta, se debe hacer de la siguiente forma como se ve en este ejemplo:
TO_DATE ('2012-03-01 14:28:00' ,'%Y-%m-%d %H:%M:%S' )

insert into hiepiact (acthis,actnum,acthex,actfen) 
values (708,'URGE',758,1,null,TO_DATE ('2012-03-01 14:28:00' ,'%Y-%m-%d %H:%M:%S' ))
Esto porque informix acepta solo el formato 'YYYY-MM-DD HH:MM:SS'.

jueves, 12 de julio de 2012

Funcion para valores Nulos


Transformación de valores nulos COALESCE () , NVL() , NVL2() , ISNULL()
Devuelve la primera expresión distinta de NULL entre sus argumentos.
Esta función para la mayoria de las base de datos (Sql Server ,Oracle, …..) Devuelve la primera expresion distinta a null de sus argumentos.

SELECT Nombre, Apellido, COALESCE(Sueldo, 0) AS Sueldo,(Incremnto + COALESCE(Sueldo, 0)) AS Total 
FROM Empleado;

Oracle : 
Trabjando con Oracle es posible usar las funciones NVL y NVL2. (NVL) es similar a la función COALESCE, pero se limita a dos argumentos. (NVL2) recibe tres argumentos, si el primer argumento es NULL, retorna el valor del segundo argumento, caso contrario retorna el valor del tercer argumento.

SELECT Nombre, Apellido, NVL(Sueldo, 0) AS Sueldo, NVL2(Sueldo, Incremento, Incremento + NVL(Sueldo, 0)) AS Total 
FROM Empleado;

Sql Server : 
Trabajando con SQL Server puede usar la función ISNULL (), que es idéntica a las función NVL de Oracle
SELECT Nombre, Apellido, ISNULL(Sueldo, 0) AS Sueldo, (Incremento + ISNULL(Sueldo, 0)) AS Total 
FROM Empleado

Informix : 
Trabjando con Informix es posible usar las funciones NVL. (NVL) es similar a la función COALESCE, pero se limita a dos argumentos. Si el primer argumento es NULL, retorna el valor del segundo argumento.
SELECT Nombre, Apellido, NVL(Sueldo, 0) AS Sueldo, NVL(Sueldo, Incremento) + NVL(Sueldo, 0)) AS Total 
FROM Empleado;

Funcion TRIM() en SQL Server 2008R2


SQL Server no tiene función que puede recortar espacios inicial o finales de cualquier cadena al mismo tiempo. SQL tienen LTRIM() y RTRIM() que puede recortar espacios iniciales y finales respectivamente. SQL Server 2008 también no tiene función TRIM(). Usuario puede fácilmente utilizar LTRIM() y RTRIM() juntos y simular la funcionalidad TRIM().
SELECT RTRIM(LTRIM(' Word ')) AS Answer;
Debe dar resultado sin espacios inicial o finales.
Respuesta
Word
He creado tras UDF que todos los días cuando tengo a TRIM() cualquier palabra o columna.

 CREATE FUNCTION dbo.TRIM(@string VARCHAR(MAX))
 RETURNS VARCHAR(MAX)
 BEGIN
 RETURN LTRIM(RTRIM(@string))
 END
 GO
Ahora déjenos probar por encima de la UDF, ejecuta la siguiente declaración donde hay iniciales y espacios alrededor de palabra.
 SELECT dbo.TRIM(' leading trailing ')
Devolverá la cadena en la ventana de resultado como
'leading trailing'

No habrá ningún espacio a su alrededor. Si espacios adicionales son datos inútiles, cuando se insertan datos en la base de datos debe recortarse. Si hay necesitamos de espacios en los datos, pero en algunos casos deben recortarse al recuperar nos puede utilizar columnas calculadas. Leer más sobre columnas SQL SERVER – Puzzle – solución – calcula explicación de tipo de datos de columnas calculadas.

El ejemplo siguiente muestra las columnas calculadas cómo puede utilizarse para recuperar datos recortados.
USE AdventureWorks
 GO
 /* Create Table */
 CREATE TABLE MyTable
 (
 ID TINYINT NOT NULL IDENTITY (1, 1),
 FirstCol VARCHAR(150) NOT NULL,
 TrimmedCol AS LTRIM(RTRIM(FirstCol))
 ) ON [PRIMARY]
 GO
 /* Populated Table */
 INSERT INTO MyTable
 ([FirstCol])
 SELECT ' Leading'
 UNION
 SELECT 'Trailing '
 UNION
 SELECT ' Leading and Trailing '
 UNION
 SELECT 'NoSpaceAround'
 GO
 /* SELECT Table Data */
 SELECT *
 FROM MyTable
 GO
 /* Dropping Table */
 DROP TABLE MyTable
 GO 
Por encima de consulta demuestra que cuando recuperar datos recupera recorta datos en la columna TrimmedCol. Puede ver el resultado en la siguiente imagen.
Calcula las columnas se crean ejecución tiempo y rendimiento pueden no ser óptimas si se recupera gran cantidad de datos. Algún otro tiempo veremos cómo podemos mejorar el rendimiento de columna calculada usando índice.