0

これで、通貨と値で値をグループ化して、過去30日間の値を取得できましたが、日付で検索し、最終的には別のテーブルのパラメーターを使用します。

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY date_loaded Asc) AS n, value, 
date_loaded, cast(round(value * 0.0001  / 100 * 0.5 + (value * 0.0001),4)AS dec(12,4)) as buy_rate,
        cast(round(value * 0.0001  / 100 * -0.5 + (value * 0.0001), 4) AS dec(12,4)) as sell_rate 

FROM texchange_rate WHERE source_currency_code = @source_currency_code 
and target_currency_code = @target_currency_code
and date_loaded between dateadd(day, datediff(day, 0 ,getdate())-30, 0) and getdate())

SELECT t2.value, t2.date_loaded, @source_currency_code as source_currency_code,
@target_currency_code as target_currency_code, t2.buy_rate, t2.sell_rate
    FROM cte t2 LEFT JOIN cte t1 ON t2.n = t1.n + 1
    WHERE t2.value <> ISNULL(t1.value, -1)

    order by date_loaded desc

END

dateaddが別のテーブルから検索する日数を定義したいのですが、これは可能ですか?例えば

から

dateadd(day, datediff(day, 0 ,getdate())-30, 0) and getdate())

dateadd(day, datediff(day, 0 ,getdate())@dayparameter, 0) and getdate())

これを機能させるために、@ dayparameterを宣言しようとしました(ここに似ています-http://msdn.microsoft.com/en-us/library/ms186819%28v=sql.100%29.aspx これはserver 2008)ストアドプロシージャの開始時に、dateadd内に配置するとエラーが発生します

メッセージ102、レベル15、状態1、プロシージャproc_getCurrencyHistory、48行目'@dayparameter'の近くの構文が正しくありません。

これが理にかなっていることを願っています。

4

1 に答える 1

1

まだ操作を実行する必要があります。-30 を渡したい場合は加算する必要があり、30 を渡したい場合は減算する必要があります。

@dayparameter-30 の場合:

dateadd(day, datediff(day, 0 ,getdate()) + @dayparameter, 0) and getdate())
-----------------------------------------^ this operator is important

が 30 の場合@dayparameter:

dateadd(day, datediff(day, 0 ,getdate()) - @dayparameter, 0) and getdate())
-----------------------------------------^ this operator is still important
于 2012-03-08T14:56:00.060 に答える