Definieren Sie einen Parameter für die Suche nach Tagen DATEADD / datediff – SQL Server 2005
-
09-12-2019 - |
Frage
Ich habe jetzt also eine Gruppierung der Werte nach Währungen und Werten, die die Werte der letzten 30 Tage anzeigt. Ich möchte jedoch nach Datum suchen und möglicherweise einen Parameter aus einer anderen Tabelle verwenden.
;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
Ich möchte die Anzahl der Tage, nach denen dateadd sucht, in einer separaten Tabelle definieren. Ist das möglich?Z.B.
aus
dateadd(day, datediff(day, 0 ,getdate())-30, 0) and getdate())
Zu
dateadd(day, datediff(day, 0 ,getdate())@dayparameter, 0) and getdate())
Damit das funktioniert, habe ich versucht, @dayparameter zu deklarieren (ähnlich wie hier – http://msdn.microsoft.com/en-us/library/ms186819%28v=sql.100%29.aspx, obwohl dies für Server 2008 gilt) am Anfang der gespeicherten Prozedur und das Einfügen in dateadd führt zu dem Fehler
MSG 102, Stufe 15, Status 1, Prozedur Proc_getCurrencyHistory, Zeile 48 Falsche Syntax in der Nähe von '@DayParameter'.
Ich hoffe, das macht Sinn.
Lösung
Sie müssen noch eine Operation durchführen.Wenn Sie -30 übergeben möchten, müssen Sie addieren. Wenn Sie 30 übergeben möchten, müssen Sie subtrahieren.
Wenn @dayparameter
ist -30:
dateadd(day, datediff(day, 0 ,getdate()) + @dayparameter, 0) and getdate())
-----------------------------------------^ this operator is important
Wenn @dayparameter
ist 30:
dateadd(day, datediff(day, 0 ,getdate()) - @dayparameter, 0) and getdate())
-----------------------------------------^ this operator is still important