none
Cambiar parametros datetime de todas las columnas definidas asi RRS feed

  • Pregunta

  • Buenas tardes, en el trabajo tengo un programa programado en delphi que usa base de datos de microsoft sql 2003, por un problema en el programa debo retrasar la fecha 5 años para que siga funcionando. Hay varias columnas de fecha datetime en las distintas tablas, datos que deben tener la fecha real. ¿hay alguna manera de cambiarles el formato de tal manera que a las fechas que vayan introduciendo en las tablas los distintos ordenadores conectados quede en formato dd/mm/2017 hh:mm?, es decir que aunque los datos le entren por ejemplo 01/01/2012 12:00, la base de datos automáticamente le sume 5 años a ese año o el año sea 2017, aunque los datos los reciba con fecha de 2012.

    Gracias

    martes, 13 de diciembre de 2016 19:49

Respuestas

  • Javierdtv,

    Lo cierto es que no entiendo lo que intentas hacer, no entiendo el sentido de la consulta de selección como tampoco entiendo el sentido de combinar tres veces con la misma tabla, de hecho es posible pero no es la manera y tampoco creo que sea necesario. Creo que lo siguiente bastará:

    CREATE TRIGGER dbo.fechascob
          ON dbo.cob
          AFTER INSERT, UPDATE
    AS
    BEGIN
        UPDATE c
        SET
    	   c.fechor = DATEADD (YEAR, 5, c.fechor),
    	   c.fechorret = DATEADD (YEAR, 5, c.fechorret),
    	   c.fechoranu = DATEADD (YEAR, 5, c.fechoranu)
        FROM
    	   inserted i
    	   INNER JOIN cob c ON (i.fechor = c.fechor)
    		  AND (i.fechorret = c.fechorret)
    		  AND (i.fechoranu = c.fechoranu)
    END
    GO

    Prueba y coméntanos si es lo que necesitas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    miércoles, 28 de diciembre de 2016 20:44

Todas las respuestas

  • Hola

    No me queda claro que es lo que quieres hacer, es mejor que pongas parte de la estructura de tus tablas y algunos registros de ejemplo. Dicho esto el formato en que se guardan los datetime no se puede "cambiar" es el estandar yyyy-mm-dd hh:mm:ss:mmm pero si escribirlos desde el formato que mas convenga o leerlos. Mira las funciones CONVERT y CAST. Existe tambien la funcion DATEADD.

    Te dejo un ejemplo

    set language spanish
    declare @t table (c1 datetime)
    insert into @t values(getdate())
    insert into @t values(cast('25/12/2016' as date ))
    insert into @t values(cast('25/12/2016 20:10' as datetime ))
    set language english
    insert into @t values(cast('12/25/2016' as date ))
    insert into @t values(cast('12/25/2016 20:10' as datetime ))
    insert into @t values(dateadd(year,5,getdate()))
    insert into @t values(dateadd(year,-5,getdate()))

    select c1, cast(c1 as date) sin_hora,convert(varchar,c1,112) sin_separador
    ,convert(varchar,c1,103) sin_separador,convert(varchar,c1,108) solo_hora
    ,cast(c1 as time(0)) formato_hora from @t


    Saludos.




    martes, 13 de diciembre de 2016 21:19
  • Javierdtv,

    ¿SQL Server 2003? Quizá te refieras a la versión 2000 o 2005, la versión 2003 no existe, o por lo menos yo no ando enterado de ello. Respecto a las fechas, si persistes el valor en una columna de tipo datetime dicho valor no tiene formato, las fechas no se almacenan con un formato en particular, es más, ni siquiera se almacenan en forma de "fecha". 

    Atendiendo tu caso, por cada tabla donde requieras agregar años a una o varias columnas de tipo datetime debes crear un trigger que atienda las operaciones de INSERT y UPDATE, por ejemplo, la tabla [Ventas] tiene dos columnas de tipo datetime [FechaEmision] y [FechaEntrega]

    CREATE TRIGGER dbo.ActualizarFechas
        ON dbo.Ventas
        AFTER INSERT, UPDATE
    AS
    BEGIN
        UPDATE  v
        SET
    	   v.FechaEmision = DATEADD(YEAR, 5, y.FechaEmision),
    	   v.FechaEntrega = DATEADD(YEAR, 5, y.FechaEntrega)
        FROM
    	   inserted i
    	   INNER JOIN Ventas v ON (i.idVenta = v.idVenta)
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 13 de diciembre de 2016 22:33
  • La tabla donde tengo el mayor problema (dbo.cob) tiene tres columnas llamadas fechor, fechorret y fechoranu, las tres con data type datatime y length de 8, esta columna es usada en mas de una tabla. El resto de columnas son varchar, int, smallint y float, en estas columnas los datos que se muestran estan bien.

    Se trataria de que en las tres columnas datatime, la base de datos, automáticamente sume 5 años a cada uno de los datos que le entre desde los distintos ordenadores conectados en red a esta base de datos, de manera que al mostrar la información ya sea en recibos, facturas o informes, aparezca la fecha ya con los 5 años sumados.

    De igual manera ¿es posible cambiarle la fecha actual al servidor?, la fecha del sistema sera de 2012, pero al imprimir la fecha actual en recibos en informes debe aparecer la real, 2017.

    Como ya habreis notado, soy todo un novato en esto.

    Gracias por vuestras respuestas

    miércoles, 14 de diciembre de 2016 9:19
  • Al probarlo, me da el error, me pone que la columna fechor es ambigua, imagino que sera xq esa columna esta usada en varias tablas, entiendo que debería usar SELECT y FROM para indicarle la columna de que tabla es, pero no consigo usarlo de manera adecuada ya que siempre me sale el mismo error. ¿podrias indicarme como hacerlo?,

    Gracias

    • Propuesto como respuesta Jose Collazo viernes, 23 de diciembre de 2016 21:16
    • Votado como útil Joyce_ACModerator lunes, 26 de diciembre de 2016 15:51
    viernes, 23 de diciembre de 2016 8:09
  • Hola

    Sigues sin poner parte de la estructura de tus tablas, datos de ejemplo o parte de tu código para poder ayudarte mejor. Puedes poner delante de la columna el nombre de la tabla seguido de un punto o usar un alias para cada tabla o solo para una :

    CREATE  TABLE #T1 (C1 INT,FECHOR DATETIME)
    INSERT INTO #T1 VALUES(1,GETDATE()),(2,GETDATE())
    SELECT * INTO #T2 FROM #T1
    SELECT * FROM #T1
    SELECT * FROM #T2

    SELECT #T1.C1, #T2.FECHOR FROM #T1 JOIN #T2 ON #T1.C1=#T2.C1 WHERE C1 = 2 
    --Msg 209, Level 16, State 1, Line 8
    --El nombre de columna 'C1' es ambiguo.

    -- USANDO EL NOMBRE COMPLETO DE LAS TABLAS
    SELECT #T1.C1, #T2.FECHOR FROM #T1 JOIN #T2 ON #T1.C1=#T2.C1 WHERE #T1.C1 = 2 

    -- USANDO ALIAS
    SELECT T1.C1, T2.FECHOR FROM #T1 AS T1 JOIN #T2 AS T2 ON T1.C1=T2.C1 WHERE T1.C1 = 2 

    -- EL "AS" ES OPCIONAL. PUEDES PONER ALIAS EN UNAS Y EN OTRAS NO
    SELECT T1.C1, #T2.FECHOR FROM #T1 T1 JOIN #T2 ON T1.C1=#T2.C1 WHERE #T2.C1 = 1

    Saludos

    • Propuesto como respuesta Jose Collazo viernes, 23 de diciembre de 2016 21:16
    viernes, 23 de diciembre de 2016 13:46
  • Al probarlo, me da el error, me pone que la columna fechor es ambigua, imagino que sera xq esa columna esta usada en varias tablas, entiendo que debería usar SELECT y FROM para indicarle la columna de que tabla es, pero no consigo usarlo de manera adecuada ya que siempre me sale el mismo error. ¿podrias indicarme como hacerlo?,

    Gracias

    Para nombrar las columnas  se recomienda anteponer el nombre de la tabla o el ALIAS en caso lo hayas definido:

    /*Nombrar anteponiendo el nombre de la tabla*/
    SELECT
            Clientes.Nombre
            Clientes.Edad
    FROM
            Clientes;
    
    /*Nombrar anteponiendo el alias de la tabla*/
    SELECT
            c.Nombre
            c.Edad
    FROM
            Clientes c;

    Si no logras resolver los errores que obtienes puedes postear la consulta sql que has escrito para ver si podemos ayudarte a corregir el problema.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 24 de diciembre de 2016 19:32
  • CREATE TRIGGER dbo.fechascob
          ON dbo.cob
          AFTER INSERT, UPDATE
    AS
      BEGIN
          SELECT
            cob.fechor
            cob.fechorret
            cob.fechoranu
          FROM
              cob;
          UPDATE v
          SET
            v.fechor = DATEADD (YEAR, 5, fechor),
            v.fechorret = DATEADD (YEAR, 5, fechorret),
            v.fechoranu = DATEADD (YEAR, 5, fechoranu)
          FROM
            INSERTED i
            INNER JOIN cob v ON (i.fechor = v.fechor),
            INNER JOIN cob v ON (i.fechorret = v.fechorret),
            INNER JOIN cob v ON (i.fechoranu = v.fechoranu)
       END
    GO
    

    Este es el codigo que use, después de insestar el select from, me sigue dando el mismo error, que fechor es ambiguo, por lo que no se soluciono y sigue dandome el mismo error.

    Estoy usando msdn manager para todo esto, no se si tendra algo que ver.

    En cuanto a la estructura de la base de datos, no consegui extraerla con este programa

    Un saludo y gracias por vuestras respuestas

    miércoles, 28 de diciembre de 2016 19:40
  • Javierdtv,

    Lo cierto es que no entiendo lo que intentas hacer, no entiendo el sentido de la consulta de selección como tampoco entiendo el sentido de combinar tres veces con la misma tabla, de hecho es posible pero no es la manera y tampoco creo que sea necesario. Creo que lo siguiente bastará:

    CREATE TRIGGER dbo.fechascob
          ON dbo.cob
          AFTER INSERT, UPDATE
    AS
    BEGIN
        UPDATE c
        SET
    	   c.fechor = DATEADD (YEAR, 5, c.fechor),
    	   c.fechorret = DATEADD (YEAR, 5, c.fechorret),
    	   c.fechoranu = DATEADD (YEAR, 5, c.fechoranu)
        FROM
    	   inserted i
    	   INNER JOIN cob c ON (i.fechor = c.fechor)
    		  AND (i.fechorret = c.fechorret)
    		  AND (i.fechoranu = c.fechoranu)
    END
    GO

    Prueba y coméntanos si es lo que necesitas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    miércoles, 28 de diciembre de 2016 20:44