una - Encuentra la fecha más cercana en SQL Server
sql server isdate function example (4)
Tengo una tabla dbo.X
con la column Y
DateTime
que puede tener cientos de registros.
Mi procedimiento almacenado tiene el parámetro @CurrentDate
, quiero averiguar la fecha en la column Y
en la tabla anterior dbo.X
que es menor y más cercana a @CurrentDate.
¿Cómo encontrarlo?
La cláusula where coincidirá con todas las filas con una fecha menor que @CurrentDate y, dado que están ordenadas de forma descendente, el TOP 1 será la fecha más cercana a la fecha actual.
SELECT TOP 1 *
FROM x
WHERE x.date < @CurrentDate
ORDER BY x.date DESC
Tengo una mejor solución para este problema, creo.
Mostraré algunas imágenes para apoyar y explicar la solución final.
Antecedentes En mi solución tengo una tabla de tasas de FX. Estos representan las tasas de mercado para diferentes monedas. Sin embargo, nuestro proveedor de servicios ha tenido un problema con la alimentación de velocidad y, como tal, algunas tarifas tienen valores cero. Quiero llenar los datos faltantes con tasas para la misma moneda que se acerque más a la tasa faltante. Básicamente, quiero obtener el RateId para la tasa más cercana a cero que luego sustituiré. (Esto no se muestra aquí en mi ejemplo.)
1) Por lo tanto, para comenzar, identifiquemos la información de tasas faltantes:
Consulta que muestra mis tasas faltantes, es decir, tener un valor de tasa de cero
2) A continuación le permite identificar las tarifas que no faltan. Consulta que muestra las tasas que no faltan.
3) Esta consulta es donde ocurre la magia. He hecho una suposición aquí que puede eliminarse pero se agregó para mejorar la eficiencia / rendimiento de la consulta. El supuesto en la línea 26 es que espero encontrar una transacción sustituta el mismo día que la transacción faltante / cero. La magia que ocurre es la línea 23: la función Número_de_ Fila agrega un número automático que comienza en 1 para la diferencia de tiempo más corta entre la transacción que falta y la que no falta. La siguiente transacción más cercana tiene un rownum de 2, etc.
Tenga en cuenta que en la línea 25 debo unir las monedas para que no coincida con los tipos de moneda. Es decir, no quiero sustituir una moneda AUD por valores de CHF. Quiero las monedas más cercanas que coinciden.
4) Finalmente, obtengamos datos donde RowNum es 1 La consulta final
La consulta completa de la consulta es la siguiente;
; with cte_zero_rates as
(
Select *
from fxrates
where (spot_exp = 0 or spot_exp = 0)
),
cte_non_zero_rates as
(
Select *
from fxrates
where (spot_exp > 0 and spot_exp > 0)
)
,cte_Nearest_Transaction as
(
select z.FXRatesID as Zero_FXRatesID
,z.importDate as Zero_importDate
,z.currency as Zero_Currency
,nz.currency as NonZero_Currency
,nz.FXRatesID as NonZero_FXRatesID
,nz.spot_imp
,nz.importDate as NonZero_importDate
,DATEDIFF(ss, z.importDate, nz.importDate) as TimeDifferece
,ROW_NUMBER() Over(partition by z.FXRatesID order by abs(DATEDIFF(ss, z.importDate, nz.importDate)) asc) as RowNum
from cte_zero_rates z
left join cte_non_zero_rates nz on nz.currency = z.currency
and cast(nz.importDate as date) = cast(z.importDate as date)
--order by z.currency desc, z.importDate desc
)
select n.Zero_FXRatesID
,n.Zero_Currency
,n.Zero_importDate
,n.NonZero_importDate
,DATEDIFF(s, n.NonZero_importDate,n.Zero_importDate) as Delay_In_Seconds
,n.NonZero_Currency
,n.NonZero_FXRatesID
from cte_Nearest_Transaction n
where n.RowNum = 1
and n.NonZero_FXRatesID is not null
order by n.Zero_Currency, n.NonZero_importDate
Use DateDiff y ordene su resultado por cuántos días o segundos hay entre esa fecha y cuál fue la entrada
Algo como esto
select top 1 rowId, dateCol, datediff(second, @CurrentDate, dateCol) as SecondsBetweenDates
from myTable
where dateCol < @currentDate
order by datediff(second, @CurrentDate, dateCol)
CREATE PROCEDURE CurrentDate
@CurrentDate DATETIME
AS
BEGIN
Select * from orders
where OrderDate < @CurrentDate
END
GO