validar una texto operaciones obtener numero isdate hora fechas fecha extraer example convertir con año actual sql sql-server date

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.

Combinar los dos conjuntos de datos con un número de fila para identificar la transacción más cercana

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