none
Como obtener un full join por fecha RRS feed

  • Pregunta

  • Que tal , compañeros, estoy tratando de realizar un join de tablas(SQL Server 2008) por medio de un campo fecha en el que mi tabla1 tiene fecha en formato datetime 01/01/2019 00:00:00 y mi tabla2 tiene igualmente un datetime pero éste si guarda hora(01/01/2019 13:15:21)

    el plan es machear solo fecha sin importar la hora, para lo cual usaba un storeprocedure

    declare @fechaIni datetime,@fechaFin datetime
    as
    select fecha,isnull(MontoInversion,0) AS MontoInversion,sum(ventas)as VentaObtenida from cortes full join Balanceinversion B on cortes.fecha=B.FechaReferencia where concepto=' venta' and convert(varchar(10),fecha,103)>= convert(varchar(10),@fechaIni,103) and convert(varchar(10),fecha,103)<=convert(varchar(10),@fechaFin,103) 
    group by fecha order by fecha
    pero no consigo encontrar el formato de fecha equivalente

    La programacion en Microsoft cada ves se torna inalcanzable

    martes, 3 de septiembre de 2019 1:58

Respuestas

Todas las respuestas

  • Hola,

    Si no te he entendido mal, sería algo así:

    DECLARE @fechaIni DATETIME
    	,@fechaFin DATETIME AS
    
    SELECT fecha
    	,isnull(MontoInversion, 0) AS MontoInversion
    	,sum(ventas) AS VentaObtenida
    FROM cortes
    FULL JOIN Balanceinversion B
    	ON cortes.fecha = B.FechaReferencia
    WHERE concepto = ' venta'
    	AND cast(fecha as date) >= cast(@fechaIni as date)
    	AND cast(fecha as date) <= cast(@fechaFin as date)
    GROUP BY fecha
    ORDER BY fecha

    Es decir, en lugar de intentar como hacías convertir las fechas a texto, lo que deberías hacer es mediante "cast" indicar a SQL que utilice únicamente la parte de fecha sin la hora.

    Espero que te sirva.

    Un saludo.

    Diego

    • Propuesto como respuesta Javi Fernández F miércoles, 4 de septiembre de 2019 4:39
    martes, 3 de septiembre de 2019 7:25
  • Deleted
    martes, 3 de septiembre de 2019 9:04
  • Hola,

    Si no te he entendido mal, sería algo así:

    DECLARE @fechaIni DATETIME
    	,@fechaFin DATETIME AS
    
    SELECT fecha
    	,isnull(MontoInversion, 0) AS MontoInversion
    	,sum(ventas) AS VentaObtenida
    FROM cortes
    FULL JOIN Balanceinversion B
    	ON cortes.fecha = B.FechaReferencia
    WHERE concepto = ' venta'
    	AND cast(fecha as date) >= cast(@fechaIni as date)
    	AND cast(fecha as date) <= cast(@fechaFin as date)
    GROUP BY fecha
    ORDER BY fecha

    Es decir, en lugar de intentar como hacías convertir las fechas a texto, lo que deberías hacer es mediante "cast" indicar a SQL que utilice únicamente la parte de fecha sin la hora.

    Espero que te sirva.

    Un saludo.

    Diego

    Pues no amigo, si usao el casteo solo me retorna la fecha del 31/08/2019 con el valor de campo venta.

    Nose si tenga que indicar el lenguaje del sql


    La programacion en Microsoft cada ves se torna inalcanzable

    miércoles, 4 de septiembre de 2019 19:04
  • el plan es machear solo fecha sin importar la hora, para lo cual usaba un storeprocedure

    ¿Cómo se declararon los parámetros del procedimiento?

    Pruebe:

    -- código #1 v2
    CREATE PROCEDURE XXX 
        @fechaIni date, @fechaFin date
    as 
    begin
    
    SELECT coalesce (cast (A.fecha as date), B.FechaReferencia) as fecha, 
    sum (coalesce (B.MontoInversion, 0)) as MontoInversion, sum (coalesce (A.ventas, 0)) as VentaObtenida from cortes as A full join Balanceinversion B on cast (A.fecha as date) = B.FechaReferencia where concepto=' venta' and cast (A.fecha as date) between @fechaIni and @fechaFin        and B.FechaReferencia between @fechaIni and @fechaFin
    group by coalesce (cast (A.fecha as date), B.FechaReferencia) order by fecha;

    end;
    go
      

    Si esta respuesta te ayudó a resolver tu problema, recuerda marcarla.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Wow no creí que funcionara, solo tube que reemplazar 

     sum (coalesce (B.MontoInversion

    por 'coalesce (B.MontoInversion, 0) as MontoInversion'

    para que no sumara los montos de otra fecha

    y un or 

    B.FechaReferencia

    Mil gracias


    La programacion en Microsoft cada ves se torna inalcanzable

    miércoles, 4 de septiembre de 2019 20:04