40

何百ものレコードがあるテーブルdbo.Xがあります。DateTime column Y

私のストアドプロシージャにはパラメータがあります。上記の表で、より小さく、最も近い@CurrentDate日付を調べたいです。column Ydbo.X@CurrentDate.

それを見つける方法は?

4

4 に答える 4

80

where句は、日付が@CurrentDate未満のすべての行に一致し、降順であるため、TOP1が現在の日付に最も近い日付になります。

SELECT TOP 1 *
FROM x
WHERE x.date < @CurrentDate
ORDER BY x.date DESC
于 2012-12-24T15:36:35.043 に答える
16

DateDiffを使用して、その日付と入力の間にある日数または秒数で結果を並べ替えます

このようなもの

    select top 1 rowId, dateCol, datediff(second, @CurrentDate, dateCol) as SecondsBetweenDates
    from myTable
    where dateCol < @currentDate
    order by datediff(second, @CurrentDate, dateCol)
于 2012-12-24T15:33:11.093 に答える
2

私はこの問題に対してより良い解決策があると思います。

最終的な解決策をサポートおよび説明するために、いくつかの画像を示します。

背景 私のソリューションには、為替レートの表があります。これらは、さまざまな通貨の市場レートを表しています。ただし、サービスプロバイダーはレートフィードに問題があるため、一部のレートの値はゼロです。欠測データに、欠測レートに時間的に最も近い同じ通貨のレートを入力したいと思います。基本的に、最も近いゼロ以外のレートのRateIdを取得し、それを置き換えます。(これは私の例ではここには示されていません。)

1)まず、不足している料金情報を特定しましょう。

私の不足しているレートを示すクエリ、つまりレート値がゼロである

2)次に、欠落していないレートを特定します。 欠落していないレートを示すクエリ

3)このクエリは魔法が起こる場所です。ここでは、削除できると仮定しましたが、クエリの効率/パフォーマンスを向上させるために追加されました。26行目の仮定は、行方不明/ゼロのトランザクションと同じ日に代替トランザクションを見つけることを期待しています。魔法は23行目です。Row_Number関数は、欠落しているトランザクションと欠落していないトランザクションの間の最短の時間差のために、1から始まる自動番号を追加します。次に近いトランザクションの行数は2などです。

25行目では、通貨の種類が一致しないように、通貨を結合する必要があることに注意してください。つまり、AUD通貨をCHF値に置き換えたくないのです。最も近い通貨が欲しいです。

2つのデータセットを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
于 2018-01-05T12:36:58.310 に答える
-7
CREATE PROCEDURE CurrentDate
@CurrentDate DATETIME
AS
BEGIN
    Select * from orders
    where OrderDate < @CurrentDate
END
GO
于 2012-12-24T15:54:01.913 に答える