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

lunes, 4 de enero de 2016

Obtener diferencia entre fechas SQL SERVER

Obtendremos la diferencia entre dos fechas por el intervalo que queramos (años, dias horas, etc.)

Esto lo podemos realizar mediante la función SQL DATEDIFF.

La sintaxis de esta función es la siguiente:  DATEDIFF(Intervalo, Fecha inicial, Fecha final)

Donde el intervalo indica como quiere que le diga el resutltado de la direfencia de fechas, o sea en días, horas etc.

Ejemplos:

SELECT DATEDIFF(year, '04/01/2012', GETDATE());
SELECT DATEDIFF(month, '04/01/2012', GETDATE());
SELECT DATEDIFF(day, '04/01/2012', GETDATE());
SELECT DATEDIFF(week, '04/01/2012', GETDATE());
SELECT DATEDIFF(hour, '04/01/2012', GETDATE());
SELECT DATEDIFF(minute, '04/01/2012', GETDATE()); 


Puede consultar más ejemplos desde aquí.

Obtener diversos formatos de fecha SQL Server

Os muestro una selección de los diversos formatos de fecha que puedes obtener para SQL Server:


SELECT
CONVERT (VARCHAR, getdate(), 101), -- 01/04/2016
CONVERT (VARCHAR, getdate(), 102), -- 2016.01.04
CONVERT (VARCHAR, getdate(), 103), -- 04/01/2016
CONVERT (VARCHAR, getdate(), 104), -- 04.01.2016
CONVERT (VARCHAR, getdate(), 105), -- 04-01-2016
CONVERT (VARCHAR, getdate(), 106), -- 04 Ene 2016
CONVERT (VARCHAR, getdate(), 107), -- Ene 04, 2016
CONVERT (VARCHAR, getdate(), 108), -- 17:03:57
CONVERT (VARCHAR, getdate(), 109), -- Ene  4 2016  5:03:57:667PM
CONVERT (VARCHAR, getdate(), 110), -- 01-04-2016
CONVERT (VARCHAR, getdate(), 111), -- 2016/01/04
CONVERT (VARCHAR, getdate(), 112), -- 20160104
CONVERT (VARCHAR, getdate(), 113), -- 04 Ene 2016 17:03:57:667
CONVERT (VARCHAR, getdate(), 114), -- 17:03:57:667
CONVERT (VARCHAR, getdate(), 120), -- 2016-01-04 17:03:57
CONVERT (VARCHAR, getdate(), 121), -- 2016-01-04 17:03:57.667
CONVERT (VARCHAR, getdate(), 126), -- 2016-01-04T17:03:57.667
CONVERT (VARCHAR, getdate(), 127), -- 2016-01-04T17:03:57.667
CONVERT (VARCHAR, getdate(), 131)  -- 24/03/1437  5:03:57:667PM

sábado, 2 de enero de 2016

Migrar/cambiar mySQL a SQL Server (SqlSrv) con PHP

Te indicamos los requisitos y pasos que hemos seguido para cambiar en PHP las llamadas a una base de datos mySQL a otra identica en SQL Server.

Podéis ver los requisitos desde este enlace:

https://msdn.microsoft.com/es-es/library/cc296170.aspx

Los pasos son los siguientes:
  • Instalar PHP, en nuestro caso la versión 5.5.30, importante que sea x86, según hemos leído el sqlSrv solo va actualmente con la versión x86, aunque tengas una versión deWindows de 64 bits.
         Aquí lo podéis descargar: http://windows.php.net/download#php-5.5

         Y desde este enlace podéis tener información de como instalarlo en IIS:
         https://technet.microsoft.com/es-es/library/hh994592.aspx

  • Instalar Microsoft Native Client : http://php.net/manual/es/sqlsrv.requirements.php
  • Instalar Microsoft ODBC Driver 11: https://www.microsoft.com/en-us/download/details.aspx?id=36434
  • Descargar los ficheros del sqlSrv Version 3.1: https://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx
  • Se te habrán descargado unos ficheros con diversas versiones del sqSrv para las diferentes versiones de PHP, en nuestro caso la versión será la 5.5.
          En este caso hay 4 ficheros para la versión 5.5:
              - php_sqlsrv_55.dll
              - php_pdo_sqlsrv_55.dll 
              - php_sqlsrv_55_nts.dll
              - php_pdo_sqlsrv_55_nts.dll 


          Escogemos los 2 que estan en negrita, porque viendo el parámetro Thread Safety que hay en el
          phpInfo sale como Disabled, si no cogeríamos los otros ficheros.

          Con estos ficheros lo que hacemos es ponerlos en la carpeta e extensiones de php, en nuestro
          caso c:\php\ext, la ubicación de esta carpeta la podéis sacar del fichero php.ini, buscando
          extension_dir.

          Finalmente en el fichero php.ini hay que agregar las extensiones, de esta forma:
              extension=php_sqlsrv_55_nts.dll
              extension=php_pdo_sqlsrv_55_nts.dll
  • Instalar Microsoft Visual c++ 2012 Redistribuible x86 si es necesario, en nuestro caso lo necesitabamos, porque nos daba un error sobre el fichero MSVCR110.dll, al ejecutar el fichero php.exe.
  • Reiniciar Windows
Estos son los pasos que seguimos nosotros para poder utilizar una base de datos en SQL Server desde PHP.


martes, 29 de diciembre de 2015

Generar tabla SQL desde un XML con OpenXML

Mediante OPENXML podemos obtener las filas en SQL de un XML, de forma que esa información pueda utilizarse en tablas SQL Server.

Os pongo un ejemplo a continuación de como hacerlo, donde muestra un listado de ejemplos y en cada ejemplo su código:

DECLARE @xml VARCHAR(MAX) =
'<cEjemplo_List>
  <cEjemploBO>
    <codigo>1</codigo>
  </cEjemploBO>
  <cEjemploBO>
    <codigo>2</codigo>
  </cEjemploBO>
</cEjemplo_List>'

DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @xml

SELECT codigo
FROM  OPENXML (@idoc, '/cEjemplo_List/cEjemploBO', 2) WITH
(
    codigo INT //Teniendo en cuenta mayúculas y minúsculas
)


Este era un pequeño ejemplo del uso fácil de esta utilidad, para un XML simple.

Podréis obtener más información y otros ejempos desde aquí.

lunes, 28 de diciembre de 2015

Función LIMIT de mySQL equivalente en SQL Server para paginaciones

La función Limit se suele utilizar para determinar un número concreto de filas, pero para eso ya existe en SQL Server Top.

Por ejemplo:

SELECT TOP 10  Codigo FROM dudas

Que sería lo equivalente a:

SELECT Codigo FROM dudas LIMIT 10

Pero a parte e esto se puede utilizar para PAGINAR, lo malo es que esta función no la tenemos para SQL Server y por lo tanto se puee hacer de esta forma siguiente:

A partir de este ejempo en mysql, donde se devolverla 10 filas a partir de la fila 0.

SELECT 
   Codigo 
FROM dudas 
ORDER BY Codigo DESC
LIMIT 10 OFFSET 0

Obtenemos los mismos resultados así:

SELECT Codigo
FROM
(
      SELECT

          Codigo,
          ROW_NUMBER() OVER (ORDER BY Codigo DESC) as numFila
      FROM dudas
) subSelect
WHERE numFila > 0 AND numFila <= 0 + 10



jueves, 24 de diciembre de 2015

Cambiar número por letras desde SQL Server

Con esta función podréis cambiar un número en letras, esto os puede venir venir bien si por ejemplo queréis poner un número en un informe que requiera poner el importe en letras.

La función simplemente consiste en pasarle el número y devolverá este mismo transformado en una cadena de carácteres y formateado en letras.

ALTER function [dbo].[NumerosPalabras](@s VARCHAR(50)) RETURNS VARCHAR(1024)
AS
    BEGIN

    DECLARE @a char(1),@b char(1),@c char(1),@i int, @j int, @result VARCHAR(1024), @orlen int
    SET @orlen=LEN(@s)
    IF LEN(@s) % 3>0
        SET @s=' '+@S
    IF LEN(@s) % 3>0
        SET @s=' '+@S
    SET @i=1 SET @result=''
    IF LEN(@s) < 10 AND CAST(@s as DECIMAL(38, 10)) = 0
        SET @result='cero'

    WHILE @i<=LEN(@s)
        BEGIN

        SET @j=LEN(@s)-@i+1
        SET @a=substring(@s,@j,1)
        SET @b=substring(@s,@j-1,1)
        SET @c=substring(@s,@j-2,1)
        IF isnumeric(@a)=1
            BEGIN
            SET @result=CASE
                WHEN (@i-1=3) AND (@c+@b+@a<>'000') THEN 'mil'
                WHEN (@i-1=6) AND (@c+@b+@a<>'000') AND(@orlen=7)AND(@a='1') THEN 'millón '
                WHEN (@i-1=6) AND (@c+@b+@a<>'000') THEN 'millones '
                WHEN (@i-1=9) AND (@c+@b+@a<>'000') THEN 'mil millones'
                WHEN (@i-1=12) AND (@c+@b+@a<>'000') AND (@orlen=13)AND(@a='1') THEN 'billón '
                WHEN (@i-1=12) AND (@c+@b+@a<>'000') THEN 'billones '
                WHEN (@i-1=15) AND (@c+@b+@a<>'000') THEN 'mil billones'
                WHEN (@i-1=18) AND (@c+@b+@a<>'000') AND (@orlen=19)AND(@a='1') THEN 'trillón '
                WHEN (@i-1=18) AND (@c+@b+@a<>'000') THEN 'trillones '
                WHEN (@i-1=21) AND (@c+@b+@a<>'000') THEN 'mil trillones'
                WHEN (@i-1=24) AND (@c+@b+@a<>'000') AND (@orlen=25)AND(@a='1') THEN 'quadrillón '
                WHEN (@i-1=24) AND (@c+@b+@a<>'000') THEN 'quadrillones '
                WHEN (@i-1=27) AND (@c+@b+@a<>'000') THEN 'mil quadrillones'
                WHEN (@i-1=30) AND (@c+@b+@a<>'000') AND (@orlen=31)AND(@a='1') THEN 'quintillón '
                WHEN (@i-1=30) AND (@c+@b+@a<>'000') THEN 'quintillones '
                WHEN (@i-1=33) AND (@c+@b+@a<>'000') THEN 'mil quintillones'
                WHEN (@i-1=36) AND (@c+@b+@a<>'000') AND (@orlen=37)AND(@a='1') THEN 'sextillón '
                WHEN (@i-1=36) AND (@c+@b+@a<>'000') THEN 'sextillones '
                WHEN (@i-1=39) AND (@c+@b+@a<>'000') THEN 'mil sextillones'
                WHEN (@i-1=42) AND (@c+@b+@a<>'000') AND (@orlen=43)AND(@a='1') THEN 'septillón '
                WHEN (@i-1=42) AND (@c+@b+@a<>'000') THEN 'septillones '
                WHEN (@i-1=45) AND (@c+@b+@a<>'000') THEN 'mil septillones'
                WHEN (@i-1=48) AND (@c+@b+@a<>'000') AND (@orlen=49)AND(@a='1') THEN 'octillón '
                WHEN (@i-1=48) AND (@c+@b+@a<>'000') THEN 'octillones '
                WHEN (@i-1=51) AND (@c+@b+@a<>'000') THEN 'mil octillones'
                WHEN (@i-1=54) AND (@c+@b+@a<>'000') AND (@orlen=55)AND(@a='1') THEN 'nonillón '
                WHEN (@i-1=54) AND (@c+@b+@a<>'000') THEN 'nonillones '
                WHEN (@i-1=57) THEN 'mil nonillones'
                ELSE ''
                END+' '+@result
            IF(@b!='1' AND @b!='2') OR @b=' '
                SET @result=case @a
                        WHEN '1' THEN 'un'
                        WHEN '2' THEN 'dos'
                        WHEN '3' THEN 'tres'
                        WHEN '4' THEN 'cuatro'
                        WHEN '5' THEN 'cinco'
                        WHEN '6' THEN 'seis'
                        WHEN '7' THEN 'siete'
                        WHEN '8' THEN 'ocho'
                        WHEN '9' THEN 'nueve'
                        ELSE ''
                        END+' '+@result
            IF(isnumeric(@b)=1 )AND (@b!='0')
                IF @b='1' OR @b='2'
                SET @result=case @b+@a
                        WHEN '10' THEN 'diez'
                        WHEN '11' THEN 'once'
                        WHEN '12' THEN 'doce'
                        WHEN '13' THEN 'trece'
                        WHEN '14' THEN 'catorce'
                        WHEN '15' THEN 'quince'
                        WHEN '16' THEN 'dieciséis'
                        WHEN '17' THEN 'diecisiete'
                        WHEN '18' THEN 'dieciocho'
                        WHEN '19' THEN 'diecinueve'
                        WHEN '20' THEN 'veinte'
                        WHEN '21' THEN 'veintiuno'
                        WHEN '22' THEN 'veintidós'
                        WHEN '23' THEN 'veintitrés'
                        WHEN '24' THEN 'veinticuatro'
                        WHEN '25' THEN 'veinticinco'
                        WHEN '26' THEN 'veintiséis'
                        WHEN '27' THEN 'veintisiete'
                        WHEN '28' THEN 'veintiocho'
                        WHEN '29' THEN 'veintinueve'
                        ELSE ''
                        END+' '+@result
                ELSE
                SET @result=case @b
                        WHEN '3' THEN 'treinta'
                        WHEN '4' THEN 'cuarenta'
                        WHEN '5' THEN 'cincuenta'
                        WHEN '6' THEN 'sesenta'
                        WHEN '7' THEN 'setenta'
                        WHEN '8' THEN 'ochenta'
                        WHEN '9' THEN 'noventa'
                        ELSE ''
                        END+case @a WHEN '0' THEN '' ELSE ' y' END+' '+@result
            END
            IF (isnumeric(@c)=1)AND (@c!='0')
                IF @a='0' AND @b='0'
                    SET @result=case @c
                        WHEN '1' THEN 'cien'
                        WHEN '2' THEN 'doscientos'
                        WHEN '3' THEN 'trescientos'
                        WHEN '4' THEN 'cuatrocientos'
                        WHEN '5' THEN 'quinientos'
                        WHEN '6' THEN 'seiscientos'
                        WHEN '7' THEN 'setecientos'
                        WHEN '8' THEN 'ochocientos'
                        WHEN '9' THEN 'novecientos'
                    ELSE ''
                    END+' '+@result
                ELSE
                    SET @result=case @c
                        WHEN '1' THEN 'ciento'
                        WHEN '2' THEN 'doscientos'
                        WHEN '3' THEN 'trescientos'
                        WHEN '4' THEN 'cuatrocientos'
                        WHEN '5' THEN 'quinientos'
                        WHEN '6' THEN 'seiscientos'
                        WHEN '7' THEN 'setecientos'
                        WHEN '8' THEN 'ochocientos'
                        WHEN '9' THEN 'novecientos'
                    ELSE ''
                    END+' '+@result
        SET @i=@i+3
        END
    SET @result=LTRIM(RTRIM(@result))
    IF left(@result,7)='un mil '
        SET @result=right(@result,LEN(@result)-3)
    IF right(@result,3)=' un'
        SET @result=@result+'o'
    IF left(@result,2)='y '
        SET @result=right(@result,LEN(@result)-2)
    While CHARINDEX('  ', @result)>0
        SET @result=REPLACE(@result,'  ',' ')
    IF CHARINDEX('millones', @result) > 0
        SET @result=REPLACE(@result,'mil millones','mil')
    IF CHARINDEX('billones', @result) > 0
        SET @result=REPLACE(@result,'mil billones','mil')
    IF CHARINDEX('trillones', @result) > 0
        SET @result=REPLACE(@result,'mil trillones','mil')
    IF CHARINDEX('quadrillones', @result) > 0
        SET @result=REPLACE(@result,'mil quadrillones','mil')
    IF CHARINDEX('quintillones', @result) > 0
        SET @result=REPLACE(@result,'mil quintillones','mil')
    IF CHARINDEX('sextillones', @result) > 0
        SET @result=REPLACE(@result,'mil sextillones','mil')
    IF CHARINDEX('septillones', @result) > 0
        SET @result=REPLACE(@result,'mil septillones','mil')
    IF CHARINDEX('octillones', @result) > 0
        SET @result=REPLACE(@result,'mil octillones','mil')
    IF CHARINDEX('nonillones', @result) > 0
        SET @result=REPLACE(@result,'mil nonillones','mil')

    RETURN UPPER(LEFT(@result, 1)) + RIGHT(@result, LEN(@result) -1 )
END