2017-12-26 10 views
1

Ich brauche Hilfe beim Sortieren von Daten in chronologischer Reihenfolge und stopfen sie in eine Zeichenfolge.Ich brauche Hilfe Sortieren von Daten aus einer SQL Server-Tabelle und stopfen sie in einer Zeichenfolge

Ich habe die folgende Abfrage:

DECLARE @cols AS NVARCHAR(MAX) 
SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(FORMAT(WorkDate, 'M/d/yyyy', 'en-US')) 
        FROM JobScheduleDate 
        WHERE WorkDate >= '12/26/2017' AND WorkDate <= '01/23/2018' 
        ORDER BY ',' + QUOTENAME(FORMAT(WorkDate, 'M/d/yyyy', 'en-US')) 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 
PRINT @cols 

Die JobScheduleDate Tabelle enthält die folgenden Daten hat:

12/26/2017 
12/27/2017 
12/28/2017 
12/29/2017 
1/1/2018 
1/2/2018 
1/3/2018 
1/4/2018 
1/5/2018 
1/8/2018 
1/9/2018 
1/10/2018 
1/11/2018 
1/12/2018 
1/15/2018 
1/16/2018 
1/17/2018 
1/18/2018 
1/19/2018 
1/22/2018 
1/23/2018 

Meine Ergebnisse sind wie folgt:

[1/10/2018],[1/11/2018],[1/12/2018],[1/16/2018],[1/17/2018],[1/18/2018], 
1/19/2018],[1/2/2018],[1/22/2018],[1/23/2018],[1/3/2018],[1/4/2018], 
[1/5/2018],[1/8/2018],[1/9/2018],[12/26/2017],[12/27/2017],[12/28/2017],[12/29/2017] 
+0

Das Ergebnis muss im Format M/d/jjjj sein – user3662078

Antwort

2

Die einfachste Methode wäre, um die Daten zu formatieren mit ANSI-Standard-Format:

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(FORMAT(WorkDate, 'yyyy-M-d', 'en-US')) 
         FROM JobScheduleDate 
         WHERE WorkDate >= '2017-12-26' AND WorkDate <= '2018-01-23' 
         ORDER BY ',' + QUOTENAME(FORMAT(WorkDate, 'yyyy-M-d', 'en-US')) 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'), 1, 1,''); 

Das ist meine erste Empfehlung wäre. Sie können auch dieses mit Ihrem Format tun:

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(FORMAT(WorkDate, 'M/d/yyyy', 'en-US')) 
         FROM JobScheduleDate 
         WHERE WorkDate >= '2017-12-26' AND WorkDate <= '2018-01-23' 
         GROUP BY ',' + QUOTENAME(FORMAT(WorkDate, 'M/d/yyyy', 'en-US')) 
         ORDER BY MIN(WorkDate) 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 

Dies setzt voraus, dass WorkDate ein Datum ist. Wenn es eine Zeitkomponente hat, verwenden Sie CAST(WorkDate as date) für die GROUP BY und ORDER BY.

+0

Ihr erster Vorschlag funktioniert gut mit einem ANSI-Standardformat (und ich kann alle Formatierungen entfernen und die gleichen Ergebnisse erhalten), aber ich muss das Datum in mm/tt/jjjj, formatieren. Ihr zweiter Vorschlag funktioniert nicht als WorkDate ist nicht in der SELECT DISTINCT-Anweisung – user3662078

+1

Entfernen Sie die "DISTINCT" auf der zweiten Abfrage. Sie brauchen es nicht, da Sie bereits nach demselben Ausdruck gruppieren. Aber ich denke, es sollte auch funktionieren, wenn man einfach nach 'WorkDate' (oder' CAST (WorkDate as Date) 'gruppiert, wenn es eine Zeitkomponente enthält. –

+0

Das Entfernen von DISTINCT hat den Trick gemacht. Sie haben auch Recht, es funktionierte nur mit GROUP BY Arbeitsdatum. – user3662078

2

wie diese versuchen;

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(FORMAT(WorkDate, 'M/d/yyyy', 'en-US')) 
        FROM (select * from JobScheduleDate WHERE WorkDate >= '12/26/2017' AND WorkDate <= '01/23/2018' order by WorkDate) JobScheduleDate 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

Sie sollten die Daten aus der geordneten Menge von WorkDate ASC abrufen.

2

Verwenden Sie einfach workdate ohne String Formating

DECLARE @cols AS NVARCHAR(MAX) 
SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(FORMAT(WorkDate, 'M/d/yyyy', 'en-US')) 
        FROM JobScheduleDate 
        WHERE WorkDate >= '12/26/2017' AND WorkDate <= '01/23/2018' 
        ORDER BY WorkDate 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 
PRINT @cols 
+0

Funktioniert nicht: ORDER BY-Elemente müssen in der Auswahlliste erscheinen, wenn SELECT DISTINCT angegeben ist. – user3662078

Verwandte Themen