none
Validar fechas de todos los registros RRS feed

  • Pregunta

  • Estimados.

    Tengo una tabla con N registros, la cual contiene un campo fecha.

    Necesito ejecutar un procedimiento siempre y cuando los N registros tengan la fecha del getdate()

    Actualmente hago lo siguiente:

    Declare @FechaProceso Varchar(10)
    SET @FechaProceso=Convert(varchar(10),GetDate(),103) 

    If Not Exists (Select Convert(varchar(10),FechaCopia,103) From #Temp2  Where Convert(varchar(10),FechaCopia,103) <> @FechaProceso)

    begin

    ETC,ETC

    Existe algun otra forma de hacer lo que expongo ?


    DBA SQL Server Santiago/Chile

    jueves, 4 de febrero de 2016 16:27

Respuestas

  • CMAPM,

    Perfecto, lo único que debes de validar es sí la columna [FechaCopia] es de tipo fecha y no incluye el tiempo. Si la columna [FechaCopia] incluye el tiempo entonces deberás convertir el valor de la columna a sólo fecha:

    IF NOT Exists(SELECT 1 FROM #Temp2 WHERE CONVERT(date, FechaCopia) <> CONVERT(date, GETDATE()))
    BEGIN
            ...
    END

    ¿La columna [FechaCopia] participa de algún índice? De ser así, la función CONVERT anulará dicho índice por lo que deberás de cambiar la expresión a lo siguiente:

    IF NOT Exists(SELECT 1 FROM #Temp2 WHERE FechaCopia >= CONVERT(date, GETDATE()) AND FechaCopia < CONVERT(date, DATEADD(DAY, 1, GETDATE()))
    BEGIN
            ...
    END

    jueves, 4 de febrero de 2016 18:08

Todas las respuestas

  • Saludos,

    Sería bueno ver que haces dentro de tu BEGIN, como recomendación te diría que tu parámetro sea de tipo Date, no solo por performance sino que tambien evitas hacer la conversión explícita a tu campo en tu Where, ahora de realizar alguna inserción/modificación, podrías probar usando merge.

    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Steve Morrison

    jueves, 4 de febrero de 2016 16:45
  • Hola Steve.

    Dentro del Begin solo ejecuto un procedimiento almacenado, y la condicion que requiero para ello es que todos los registros de la tabla sea de la fecha de ejecución.

    Esto va mas o menos asi:

    Tengo un JOB, que se trae unos archivos a una carpeta del servidor, digamos que todos esos archivos son de hoy 04/02/2016, esas fechas las cargo en una tabla temporal #Temp2 y de esta manera valido que todos los archivos tengan la fecha de la ejecucupin del job getdate()

    Si lo anterior es correcto ejecuto un SP que para este caso da lo mismo lo que haga, de todas maneras, toma informaciond e los archivos y hace algunos procesamientos matematicos.

    Para mi lo importante es lo que habia mencionado "Necesito ejecutar un procedimiento siempre y cuando los N registros tengan la fecha del getdate()" 

    Saludos Cordiales.


    DBA SQL Server Santiago/Chile

    jueves, 4 de febrero de 2016 16:50
  • Podrías hacer la validación dentro del Stored,

     CREATE PROC dbo.TuStored...

     AS

     ...

     FROM #Temp2

     WHERE FechaCopia = CONVERT(date, GetDate());

     ...

    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Steve Morrison

    jueves, 4 de febrero de 2016 17:12
  • Hola CMAPM,

    ¿Hay alguna necesidad de hacer referencia a la fecha a través de un tipo de cadena? ¿Por qué no haces uso de un tipo date?. Es correcto verificar la existencia de registros mediante el predicado Exists

    IF NOT Exists(SELECT 1 FROM #Temp2 WHERE FechaCopia <> CONVERT(date, GETDATE()))
    BEGIN
            ...
    END


    jueves, 4 de febrero de 2016 17:15
  • Hola.

    La verdad es que no hay necesidad, lo hice sin pensar mucho :)

    Lo cambio de inmediato y seguire con el Not Exist.

    Saludos Cordiales.


    DBA SQL Server Santiago/Chile

    jueves, 4 de febrero de 2016 17:57
  • CMAPM,

    Perfecto, lo único que debes de validar es sí la columna [FechaCopia] es de tipo fecha y no incluye el tiempo. Si la columna [FechaCopia] incluye el tiempo entonces deberás convertir el valor de la columna a sólo fecha:

    IF NOT Exists(SELECT 1 FROM #Temp2 WHERE CONVERT(date, FechaCopia) <> CONVERT(date, GETDATE()))
    BEGIN
            ...
    END

    ¿La columna [FechaCopia] participa de algún índice? De ser así, la función CONVERT anulará dicho índice por lo que deberás de cambiar la expresión a lo siguiente:

    IF NOT Exists(SELECT 1 FROM #Temp2 WHERE FechaCopia >= CONVERT(date, GETDATE()) AND FechaCopia < CONVERT(date, DATEADD(DAY, 1, GETDATE()))
    BEGIN
            ...
    END

    jueves, 4 de febrero de 2016 18:08
  • Estoy tratando de devolver un eror al paso del job:

    If  (Not Exists (Select 1  From borrar2 Where Convert(date,fechacopia)<>Convert(date,getdate())) And (Select count(*) From borrar2) = 100) 
    Begin
    IF 1=1
    BEGIN
    RAISERROR('Error',16, -1, @@servername )
    END
    End

    Pero el paso me indica que se ejecuto correctamente.


    DBA SQL Server Santiago/Chile

    jueves, 4 de febrero de 2016 18:16
  • La única manera de que no se produzca el error es que las expresiones que componen la instrucción IF retornen false, ¿has intentado verificar si se ingresa al bloque del primer IF?

    If  (Not Exists (Select 1  From borrar2 Where Convert(date,fechacopia)<>Convert(date,getdate())) And (Select count(*) From borrar2) = 100) 
    Begin 
    Print 'Existen registros';
    IF 1=1
    BEGIN
    RAISERROR('Error',16, -1, @@servername )
    END
    End


    jueves, 4 de febrero de 2016 18:24
  • Hola William.

    Lo solucione de esta manera:

    Declare @divisor Int

    If  Exists (Select 1  From #Temp2 Where Convert(date,fechacopia)<>Convert(date,getdate())) 
    Begin
    set @divisor=0
    Select 1/@divisor

    End

    No es muy linda que digamos pero no se me ocurrio otra :)


    DBA SQL Server Santiago/Chile

    jueves, 4 de febrero de 2016 18:29
  • Steve ya te pregunto lo que hacias dentro del bloque BEGIN...END a lo cual no diste detalle y en lo último que mencionas no entiendo el objetivo de forzar un error, ¿no es mejor enviar la cantidad de registros afectos y cuando sea 0 no se realice nada? 
    jueves, 4 de febrero de 2016 19:14
  • Hola.

    Dentro del bloque BEGIN END ejecuto un procedimiento almacenado, este es el paso 1 de un job.

    En caso de algunos registros tengan una fecha distinta al getdate() quiero que se salte al paso numero 5 que es donde envio un mail.

    En caso distinto que pase al paso 2.

    Se puede hacer lo que indico sin forzar un error ?

    Saludos Cordiales.



    DBA SQL Server Santiago/Chile

    viernes, 5 de febrero de 2016 13:45