복붙노트

[SQL] SQL 서버에서 가장 가까운 날짜 찾기

SQL

SQL 서버에서 가장 가까운 날짜 찾기

나는 기록의 수백이있을 수 있습니다 날짜 시간 열 Y와 테이블 dbo.X 있습니다.

내 저장 프로 시저 내가 미만 및 @CurrentDate에 가장 가까운 위의 표 dbo.X의 열 Y의 날짜를 찾으려면, 매개 변수 @CurrentDate 있습니다.

어떻게 그것을 찾는 방법은?

해결법

  1. ==============================

    1.그들이 descendantly 주문되기 때문에 WHERE 절은 현재 날짜에 가장 가까운 일이 될 것입니다, 상위 1을 @CurrentDate보다 적은 날짜 모든 행과 일치합니다.

    그들이 descendantly 주문되기 때문에 WHERE 절은 현재 날짜에 가장 가까운 일이 될 것입니다, 상위 1을 @CurrentDate보다 적은 날짜 모든 행과 일치합니다.

    SELECT TOP 1 *
    FROM x
    WHERE x.date < @CurrentDate
    ORDER BY x.date DESC
    
  2. ==============================

    2.사용 참조 DateDiff 및 그 날짜와 무엇을 입력했다 사이에 얼마나 많은 일 초만큼 결과를 주문

    사용 참조 DateDiff 및 그 날짜와 무엇을 입력했다 사이에 얼마나 많은 일 초만큼 결과를 주문

    이 같은

        select top 1 rowId, dateCol, datediff(second, @CurrentDate, dateCol) as SecondsBetweenDates
        from myTable
        where dateCol < @currentDate
        order by datediff(second, @CurrentDate, dateCol)
    
  3. ==============================

    3.나는 내가 생각하는이 문제에 대한 더 나은 해결책을 가지고 있습니다.

    나는 내가 생각하는이 문제에 대한 더 나은 해결책을 가지고 있습니다.

    나는 지원에 대한 몇 가지 이미지를 표시하고 최종 솔루션을 설명합니다.

    배경 내 솔루션에서 나는 FX 요금의 테이블을 가지고있다. 다음은 서로 다른 통화에 대한 시장의 비율을 나타냅니다. 그러나, 우리의 서비스 제공자는 속도 피드에 문제가 있었다과 같은 몇 가지 속도는 0 값을 가지고있다. 그 동일한 통화에 대한 요금과 누락 된 데이터를 채우기 위해 원하는 누락 된 속도 시간에 가장 가까운있다. 기본적으로 나는 다음 대체 할 가장 가까운 비 제로 속도에 대한 RateId을 싶어. (이것은 내 예를 들어 여기에 표시되지 않습니다.)

    1) 그래서 시작하려면 누락 된 요금 정보를 식별 할 수 있습니다 :

    쿼리 내 실종 속도를 보여주는 것은 즉 0의 속도 값이

    2) 다음이 누락되지 않은 요금을 식별 할 수 있습니다. 쿼리가 누락되지 않은 비율을 보여

    마법이 일어나는 곳 3)이 쿼리입니다. 나는 제거 할 수있는 여기에 가정을 만들었습니다하지만 쿼리의 효율성 / 성능을 향상시키기 위해 추가되었습니다. 라인 (26)의 가정은 내가 누락 / 제로 거래와 같은 날에 대체 거래를 찾아 낼 것으로 예상 할 것입니다. 마법이 일어나는 줄 23 다음 ROW_NUMBER 함수가 누락 및 비없는 거래 사이의 짧은 시간 차이를 1부터 시작 자동 번호를 추가합니다. 다음 가장 가까운 거래는 2 등의 ROWNUM을 가지고

    내가 통화 유형 불일치하지 않도록 노트는 라인 25에 나는 통화에 가입해야하시기 바랍니다. 그게 내가 CHF 값으로 AUD 통화를 대체하지 않으려는 것입니다. 나는 가장 가까운 일치하는 통화를 할 수 있습니다.

    ROW_NUMBER와 함께 두 개의 데이터 세트를 결합하면 가장 가까운 트랜잭션을 식별

    4) 마지막으로, ROWNUM이 1이고 데이터를 얻을 수 있습니다 마지막 쿼리

    다음과 같이 쿼리 전체 쿼리이다;

        ; 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
    
  4. ==============================

    4.

    CREATE PROCEDURE CurrentDate
    @CurrentDate DATETIME
    AS
    BEGIN
        Select * from orders
        where OrderDate < @CurrentDate
    END
    GO
    
  5. from https://stackoverflow.com/questions/14023145/find-closest-date-in-sql-server by cc-by-sa and MIT license