folgende Daten Gegeben:Sortieren nach allen Terminen unter einem bestimmten Wert absteigend dann mit allen Terminen über dem Wert aufsteigend
Effective Date
--------------
2014-01-01
2015-01-01
2016-01-01
2017-01-01
2018-01-01
ich nach dem Datum relativ bestellen möge (zum Beispiel) 2016-06-01
, in dem alle absteigend Werte unter 2016-06-01
kommen vor allen aufsteigenden Werten über 2016-06-01
.
Relative to date: 2016-06-01 the desired ordering is
Effective Date
--------------
2016-01-01
2015-01-01
2014-01-01
2017-01-01
2018-01-01
Der beste Weg, ich bin gekommen, sich mit der gewünschten Anordnung zu erreichen ist:
CREATE TABLE #Dates
(
EffectiveDate DATETIME2
);
DECLARE @CurrentDate DATETIME2 = '2016-06-01';
DECLARE @MinDate DATETIME2 = '0001-01-01';
INSERT INTO #Dates (EffectiveDate) VALUES ('2014-01-01');
INSERT INTO #Dates (EffectiveDate) VALUES ('2015-01-01');
INSERT INTO #Dates (EffectiveDate) VALUES ('2016-01-01');
INSERT INTO #Dates (EffectiveDate) VALUES ('2017-01-01');
INSERT INTO #Dates (EffectiveDate) VALUES ('2018-01-01');
SELECT
*
FROM
#Dates
ORDER BY
CASE
WHEN #Dates.EffectiveDate < @CurrentDate
THEN DATEDIFF(DAY, #Dates.EffectiveDate, @CurrentDate)
ELSE
DATEDIFF(DAY, @CurrentDate, #Dates.EffectiveDate) - DATEDIFF(DAY, @CurrentDate, @MinDate)
END;
DROP TABLE #Dates;
Gibt es einen besseren Weg, um die gewünschte Reihenfolge zu erreichen?
'IIF()' wird ab 2012 funktionieren. – BJones
Der Fall für 2008 hinzugefügt. – DVT
Nur neugierig ... warum db spezifische Sprache verwenden? Fall funktioniert immer noch in beiden. Ist das wirklich viel schneller? – xQbert