Abfrage SQL Server vs. MS Access, unterschidliche Ergebnisse

Babsi

SQL-Guru
Beiträge
147
Hallo,

ich habe ein Problem mit einer Abfrage, die ich in Access ausführen muss.
Zum Hintergrund kurz, wir migrieren eine Menge Prozesse auf den SQL Server und im Zuge dessen eben auch
diese Abfrage. In Access sieht die Abfrage so aus:


SELECT ZV.TERMINAL_ID, Year([ZV_DATE]) & "/" & Right("0" & Month([ZV_DATE]),2) AS Monat, BASE_CARDTYPE.CARDTYPE_SHORT, Sum(ZV.ZV_TURNOVER) AS [Summe von ZV_TURNOVER], Count(ZV.ZV_TURNOVER) AS [Anzahl von ZV_TURNOVER]
FROM (ZV LEFT JOIN BASE_ZVERROR ON ZV.ZVERROR_ID = BASE_ZVERROR.ZVERROR_ID) LEFT JOIN BASE_CARDTYPE ON ZV.CARDTYPE_ID = BASE_CARDTYPE.CARDTYPE_ID
WHERE (((BASE_ZVERROR.ZVERROR_CODE)=0)
AND ((BASE_CARDTYPE.CARDTYPE_SHORT) Is Not Null)
AND ((ZV.ZV_DATE)>=[Forms]![Hauptformular]![sArchiv] And (ZV.ZV_DATE)<Now()))
GROUP BY ZV.TERMINAL_ID, Year([ZV_DATE]) & "/" & Right("0" & Month([ZV_DATE]),2), BASE_CARDTYPE.CARDTYPE_SHORT
ORDER BY Year([ZV_DATE]) & "/" & Right("0" & Month([ZV_DATE]),2) DESC , BASE_CARDTYPE.CARDTYPE_SHORT DESC;


Wenn ich den Formularverweis nun ersetze durch ((ZV.ZV_DATE)>=#2024.10.01# And (ZV.ZV_DATE)<Now() bekomme ich kein Ergebnis.
Führe ich das selbe auf dem SQL Server aus, dann klappt es, bzw. ich bekomme Daten angezeigt
Wenn ich die Abfrage im alten, urprünlichen Access ausführe ist das Ergebnis aber ein ganz anderes was die Anzahl der DS angeht,m viel weniger.

Was zum Kuckuck mach ich denn da grundlegend nicht richtig?
 
Werbung:
Vermutlich ist es eine Missinterpretation des Datums
a) Die Datensätze mit Datum zwischen 1. Oktober bis heute VS
b) Die Datensätze mit Datum zwischen 10. Jänner und heute.
Kannst du das prüfen?
 
Hallo MDDaniel,

ich habe raus, dass die SQL Server Variante mir zuvile DS ausgibt und nicht so summiert wie es in der Accessabfrage passiert.
Definitiv ist die Datumsübergabe an SQL Server in der Form: '.01.10.2024' die korrekte Weise, das kann ich an der Datumsangaben prüfen wenn ich die komplett mit ausgeben lasse.

Ich prüfe das mit dem Datum jetzt noch mal genauer und melde mcih auf jeden Fall :)

Gruß, Babsi
 
Hallo,

ich habe die Abfrage noch angepasst. Und mir ist aufgefallen, dass er das datum so nicht richtrig auswertet.

SELECT zv.TERMINAL_ID,[ZV_DATE],CONCAT(Year([ZV_DATE]),'/' , Month([ZV_DATE])) AS Monat, BASE_CARDTYPE.CARDTYPE_SHORT,
Sum(ZV.ZV_TURNOVER) AS [Summe von ZV_TURNOVER], Count(ZV.ZV_TURNOVER) AS [Anzahl von ZV_TURNOVER]
FROM (zv.ZV LEFT JOIN data.BASE_ZVERROR ON ZV.ZVERROR_ID = BASE_ZVERROR.ZVERROR_ID)
LEFT JOIN data.BASE_CARDTYPE ON ZV.CARDTYPE_ID = BASE_CARDTYPE.CARDTYPE_ID
WHERE ZVERROR_CODE = 0
And data.BASE_CARDTYPE.CARDTYPE_SHORT Is Not Null
And ZV.ZV_DATE >= '2024-10-01' And ZV.ZV_DATE <= '2024-11-07'
GROUP BY TERMINAL_ID,[ZV_DATE], CARDTYPE_SHORT
order BY [ZV_DATE],CARDTYPE_SHORT

Es iwrd überhaupt nicht die Datumsbeschränkung beachtet, warum
habe schon Bertweeen und auch das Datum im
Format DD-MM-YYYY
oder DD-MM-YYYY
oder DD.MM.YYYY
oder, oder versucht 😢
 
Auf jeden Fall muss das Datum in der Form
DD.MM.YYYY : '01.10.2024'
übergeben werden, warum ?
Und wieso nimmt er die andere Begrenzung nicht?
 
Bei der Übergabe verdreht es bei unklaren Werten gerne je nach Spracheinstellung Monat und Tag.
Sicher funktionieren sollte es gegenüber SQL wenn du die ISO Form benutzt 'YYYYMMDD'. Ohne Punkt oder irgendwelche Strichlierungen.
 
Über welche MSSQL Version reden wir? Diese Syntax wirkt fremd, z.B. now() ist nicht MSSQL und muss an einem MS SQL Server doch einen Fehler werfen?

Welches Format hat die Spalte ZV.ZV_DATE?

Der MSSQL Server hat ein natives Datumsformat. Das kann man aber umstellen bzw. nach einer Neuinstallation kann das auch anders sein. Deswegen sollte man sich nie auf eine Formatierung verlassen, das wird immer mal knallen. Man gibt das Format am besten explizit mit an. convert(DATE,'01.10.2024',104) ist dein Freund.

Außerdem arbeitet man immer mit Datumsfunktionen und so wenig wie möglich mit Text.
 
Über welche MSSQL Version reden wir? Diese Syntax wirkt fremd, z.B. now() ist nicht MSSQL und muss an einem MS SQL Server doch einen Fehler werfen?

Welches Format hat die Spalte ZV.ZV_DATE?

Der MSSQL Server hat ein natives Datumsformat. Das kann man aber umstellen bzw. nach einer Neuinstallation kann das auch anders sein. Deswegen sollte man sich nie auf eine Formatierung verlassen, das wird immer mal knallen. Man gibt das Format am besten explizit mit an. convert(DATE,'01.10.2024',104) ist dein Freund.

Außerdem arbeitet man immer mit Datumsfunktionen und so wenig wie möglich mit Text.
Nein, braucht man nicht. Das Format 'YYYYMMDD' funktioniert bei einem Datetime Feld immer.
 
Werbung:
Zurück
Oben