staging.inyokaproject.org

MS-SQL Frage

Status: Gelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Hallo, ich weiss nicht ob es in "Shell und Programmieren" richtig ist, aber ich versuche trotzdem mal meine Frage hier loszuwerden. Es geht um eine MS-SQL Abfrage.

Möchte eine SQL Abfrage aus einer MS-SQL Datenbank nach 2 Feldern sortieren lassen. Aber beim zweiten Feld, dem Datum gibt es Probleme. Das Datum wird in der Abfrage in das Format dd.MM.yy gebracht was auch klappt und in der Anzeige korrekt ist. Aber die Sortierung erfolgt dann nur noch nach Artikelnummer und dem Tag im Datum, also dem ersten Feld "dd". Wenn ich das umformatieren in der Abfrage weglasse dann wird mir das Datum in dem Format angezeigt wie es in der Datenbank ist.... aber dafür sortiert.

Die fehlerhafte Abfrage:

select [Artikel],Format([Datum],'dd.MM.yy') as Datum,Format([Preis],'##.00€') as Preis FROM [Datenbanktabelle] where Kunde='1'order by [Artikel],[Datum],[Preis] asc

Diese Abfrage würde funktionieren aber sieht im Ergebnis für den Anwender nicht akzeptabel aus:

select [Artikel],[Datum],Format([Preis],'##.00€') as Preis FROM [Datenbanktabelle] where Kunde='1'order by [Artikel],[Datum],[Preis] asc

Hat jemand eine Idee??

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

Hast du die Spalte "Datum" auch wirklich als "datetime" definiert? Dann sollte es funktionieren.

PS: Aber eine Frage zu MS-SQL im UU Forum zu platzieren finde ich schon originell. Hat was.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

shiro schrieb:

Hast du die Spalte "Datum" auch wirklich als "datetime" definiert? Dann sollte es funktionieren.

Die Formatierung des Datums sollte keinen Einfluss auf die Sortierreihenfolge haben. In beiden Abfragen wird ja "Datum" im ORDER BY direkt verwendet und nicht etwa die String-Repräsentation die durch Formatieren entsteht.

PS: Aber eine Frage zu MS-SQL im UU Forum zu platzieren finde ich schon originell. Hat was.

Naja, es gibt ja MS SQL-Server für Linux. 😛

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

rklm schrieb:

shiro schrieb:

Hast du die Spalte "Datum" auch wirklich als "datetime" definiert? Dann sollte es funktionieren.

Die Formatierung des Datums sollte keinen Einfluss auf die Sortierreihenfolge haben. In beiden Abfragen wird ja "Datum" im ORDER BY direkt verwendet und nicht etwa die String-Repräsentation die durch Formatieren entsteht.

Das ist zwar richtig, dennoch würde mich die Schema Definition interessieren. Also die Ausgabe von z.B.

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='Datenbanktabelle';

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Die Eigentschaften kann ich mir anzeigen lassen:

Datentyp: datetime
Systemtyp: datetime
Primärschlüssel: False
NULL-Wert zulassen: True
Ist berechnet: False
Identität: False
Identitätsseed: 0
ID-Inkrement: 0
Länge: 8
Numerische Genauigkeit: 23
Numerische Dezimalstellen: 3
ist von geringer Dichte: False
Ist ein Spaltensatz: False
Statitsiche Semantik: False
ANSI-Auffüllstatus: False
Volltest: False

Ich habe das Problem jetzt so gelöst: Ich frage das Feld Datum zwei mal ab und vergebe nen "neuen" NAmen. Bei der zweiten Abfrage formatiere ich es nicht und lasse dann Anhand der zweiten Abfrage sortieren. Das klappt.

select [Datum] as test,[Artikel],Format([Datum],'dd.MM.yy') as Datum,Format([Preis],'##.00€') as Preis FROM [Datenbanktabelle] where Kunde='1'order by [Artikel],[test],[Preis] asc

So sortiert er nach dem Feld "Test" was ja das Datum in unformatierter Variante enthält. Klappt und somit lag der Fehler tatsächlich an der umformatierung....

Bearbeitet von rklm:

Codeblock. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

gnude schrieb:

Datentyp: datetime
Systemtyp: datetime
[...]

Schon mal gut.

Ich habe das Problem jetzt so gelöst: Ich frage das Feld Datum zwei mal ab und vergebe nen "neuen" NAmen. Bei der zweiten Abfrage formatiere ich es nicht und lasse dann Anhand der zweiten Abfrage sortieren. Das klappt.

select [Datum] as test,[Artikel],Format([Datum],'dd.MM.yy') as Datum,Format([Preis],'##.00€') as Preis FROM [Datenbanktabelle] where Kunde='1'order by [Artikel],[test],[Preis] asc

So sortiert er nach dem Feld "Test" was ja das Datum in unformatierter Variante enthält. Klappt und somit lag der Fehler tatsächlich an der umformatierung....

Ehrlich gesagt: ich kann das nicht glauben. Solange Du das Feld selbst im ORDER BY verwendest, darf die Formatierung in der Spaltenliste vom SELECT keinen Unterschied machen. Ich kenne jedenfalls kein RDBMS, das das macht. Wenn ich Zeit habe, probiere ich das mal bei http://sqlfiddle.com/ aus.

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

Datentyp: datetime

Danke für die Information. Damit ist die Spalte korrekt definiert. Bei MS-SQL wird ein berechneter Wert (hier: FORMAT) als neue "virtuelle" Spalte zugefügt. Da du zuvor die berechnete Spalte mit dem Namen "Datum" ( ... FORMAT(...) as Datum ) versiehst, wird der aus der DB gelesene Wert "überlagert". Da das "select" Statement von links nach rechts abgearbeitet wird, steht später beim "order by" nicht mehr der Wert aus der DB sondern der berechnete Wert unter "Datum" zur Verfügung.

Dein "select" Statement funktioniert, weil du am Anfang "[Datum]" zu Spalte "test" umdefinierst und später beim "order by" auf die virtuelle Spalte "test" zugreifst. Bei meinem Test mit einer MS-SQL Testtabelle hatte ich diese von dir definierte Datenüberlagerung automatisch nicht gemacht, weshalb ich mich hinsichtlich Datentyp in die Irre leiten ließ.

Resumee: Bitte in Zukunft bei berechneten Spalten (... as Spaltenname) darauf verzichten, einen im Schema definierten, vorhandenen Spaltennamen zu verwenden.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

shiro schrieb:

Resumee: Bitte in Zukunft bei berechneten Spalten (... as Spaltenname) darauf verzichten, einen im Schema definierten, vorhandenen Spaltennamen zu verwenden.

Möglicherweise reicht es auch die Spalte mit Scope zu referenzieren:

1
2
3
4
select [Artikel], Format([Datum], 'dd.MM.yy') as Datum, Format([Preis], '##.00€') as Preis
  FROM [Datenbanktabelle]
 where Kunde='1'
order by [Artikel], [Datenbanktabelle].[Datum], [Preis] asc
Antworten |