[SQL] SQL 서버에서 가장 가까운 날짜 찾기
SQLSQL 서버에서 가장 가까운 날짜 찾기
나는 기록의 수백이있을 수 있습니다 날짜 시간 열 Y와 테이블 dbo.X 있습니다.
내 저장 프로 시저 내가 미만 및 @CurrentDate에 가장 가까운 위의 표 dbo.X의 열 Y의 날짜를 찾으려면, 매개 변수 @CurrentDate 있습니다.
어떻게 그것을 찾는 방법은?
해결법
-
==============================
1.그들이 descendantly 주문되기 때문에 WHERE 절은 현재 날짜에 가장 가까운 일이 될 것입니다, 상위 1을 @CurrentDate보다 적은 날짜 모든 행과 일치합니다.
그들이 descendantly 주문되기 때문에 WHERE 절은 현재 날짜에 가장 가까운 일이 될 것입니다, 상위 1을 @CurrentDate보다 적은 날짜 모든 행과 일치합니다.
SELECT TOP 1 * FROM x WHERE x.date < @CurrentDate ORDER BY x.date DESC
-
==============================
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.나는 내가 생각하는이 문제에 대한 더 나은 해결책을 가지고 있습니다.
나는 내가 생각하는이 문제에 대한 더 나은 해결책을 가지고 있습니다.
나는 지원에 대한 몇 가지 이미지를 표시하고 최종 솔루션을 설명합니다.
배경 내 솔루션에서 나는 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.
CREATE PROCEDURE CurrentDate @CurrentDate DATETIME AS BEGIN Select * from orders where OrderDate < @CurrentDate END GO
from https://stackoverflow.com/questions/14023145/find-closest-date-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열 너무 긴 1406 데이터 - MySQL의 오류 코드 (0) | 2020.04.20 |
---|---|
[SQL] sqlite3를에 대한 기본 재귀 쿼리? (0) | 2020.04.20 |
[SQL] SQL - COALESCE와 ISNULL의 차이? [복제] (0) | 2020.04.19 |
[SQL] PostgreSQL의 IF 문 (0) | 2020.04.19 |
[SQL] MySQL은 각 카테고리의 상위 5 반환 (0) | 2020.04.19 |