istuggi 0 Geschrieben 9. Dezember 2014 Melden Teilen Geschrieben 9. Dezember 2014 Hallo, ich möchte eine Abfrage per SQL durchführen. In dieser soll er mir einen Wert auslesen, welcher am nahesten eines bestimmten Datums liegt. D.h. es gibt Einträge in der Datenbank wie folgt: Maschine - Zähler - Datum 12345 - 100 - 15.11.2014 12345 - 80 - 12.11.2014 12345 - 50 - 03.11.2014 12345 - 20 - 25.10.2014 Die Abfrage soll mir nun bspw. nur den Zähler was am nächsten zum 01.11.2014 liegt anzeigen. Wie bekomme ich das hin? Ich bin am verzweifeln. Danke Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 9. Dezember 2014 Melden Teilen Geschrieben 9. Dezember 2014 (bearbeitet) Mit der Funktion DATEDIFF http://msdn.microsoft.com/de-de/library/ms189794.aspx kannst Du dir in einer weiteren Spalte den Abstand vom 01.11. bis zum 03.11.2014 anzeigen lassen. Mit Hilfe der MIN Funktion http://msdn.microsoft.com/de-de/library/ms179916.aspx hast Du dann nur den einen passenden Wert in der SELECT-Abfrage. bearbeitet 9. Dezember 2014 von Sunny61 Zitieren Link zu diesem Kommentar
istuggi 0 Geschrieben 9. Dezember 2014 Autor Melden Teilen Geschrieben 9. Dezember 2014 einen fixen Befehl gibt es hierfür nicht? So in der Art wie SELECT Zähler WHERE Datum = NÄCHSTERWERT(1.11.2014)? Zitieren Link zu diesem Kommentar
Lian 2.421 Geschrieben 9. Dezember 2014 Melden Teilen Geschrieben 9. Dezember 2014 Je nach Datentyp kann: select * from abc where xyz between 'A' and 'B' ...verwendet werden. Siehe: http://msdn.microsoft.com/de-de/library/ms187922.aspx Beispiel "D" Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 9. Dezember 2014 Melden Teilen Geschrieben 9. Dezember 2014 einen fixen Befehl gibt es hierfür nicht? So in der Art wie SELECT Zähler WHERE Datum = NÄCHSTERWERT(1.11.2014)? TSQL ist nicht Excel. ;) Im Ernst, das hast Du in 2 Minuten erstellt und läuft wie geschmiert. Das ganze in eine Stored Procedure verpackt, schon kannst Du das Datum variabel übergeben. Zitieren Link zu diesem Kommentar
istuggi 0 Geschrieben 9. Dezember 2014 Autor Melden Teilen Geschrieben 9. Dezember 2014 ich werde mal morgen früh versuchen. Hoffe es klappt, da die Abfrage generell komplizierter ist, da ich noch andere where Klauseln drin habe... @Lian: Das geht nicht, da ich zig Einträge dann habe und immer noch nicht weiss, welches Datum das am nächsten ist. Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 9. Dezember 2014 Melden Teilen Geschrieben 9. Dezember 2014 Stück für Stück starten, schon klappt es mit den Nachbarn. ;) Zitieren Link zu diesem Kommentar
Pathomorph 1 Geschrieben 9. Dezember 2014 Melden Teilen Geschrieben 9. Dezember 2014 Was ist hiermit? SELECT TOP 1 Zähler FROM Test_Table ORDER BY CASE WHEN DATEDIFF(DAY,Datum,'01.11.2014') < 0 THEN DATEDIFF(DAY,Datum,'01.11.2014')*(-1) ELSE DATEDIFF(DAY,Datum,'01.11.2014') END Zitieren Link zu diesem Kommentar
istuggi 0 Geschrieben 10. Dezember 2014 Autor Melden Teilen Geschrieben 10. Dezember 2014 so ich habe mal probiert: SELECT a.Bezeichnung, m.SerienNummer, m.MaschinenNummer, DATEDIFF(DAY,mz.Meldedatum,'01.05.2014') AS Differenz, (SELECT mz.ZaehlerstandNeu WHERE mz.Zaehler = 'Z1') AS Z1, (SELECT mz.ZaehlerstandNeu WHERE mz.Zaehler = 'Z2') AS Z2 FROM Maschinen m INNER JOIN Anschriften an ON an.KontaktNummer = m.KundenNummer INNER JOIN Artikel a ON a.Artikelnummer = m.ArtikelNummer INNER JOIN MPSMaschinen mps ON mps.MaschinenNummer = m.MaschinenNummer INNER JOIN MaschinenOrte mo ON mo.Maschinennummer = m.MaschinenNummer INNER JOIN MaschinenZaehler mz ON mz.Maschinennummer = m.MaschinenNummer WHERE m.Kundennummer = '220238' AND (mz.Zaehler = 'Z1' OR mz.Zaehler = 'Z2') GROUP BY a.Bezeichnung, m.SerienNummer, m.MaschinenNummer, mz.Meldedatum, mz.ZaehlerstandNeu, mz.Zaehler ORDER BY m.MaschinenNummer desc Er gibt nun auch schön die Differenz aus. Aber wie bekomme ich es nun hin, dass er mir nur die mit den wenigsten Differenztagen ausgibt pro Maschinennummer und Z1 und Z2? Ich danke für Eure Hilfe! Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 10. Dezember 2014 Melden Teilen Geschrieben 10. Dezember 2014 Wo ist die MIN-Funktion? Zitieren Link zu diesem Kommentar
istuggi 0 Geschrieben 10. Dezember 2014 Autor Melden Teilen Geschrieben 10. Dezember 2014 das ist mein Problem, ich weis nicht wo und wie ich diese einbinden muss habe das hier noch versucht: WHERE m.Kundennummer = '220238' AND (mz.Zaehler = 'Z1' OR mz.Zaehler = 'Z2') AND MIN(Differenz) dann kommt die Meldung: In der Nähe von 'GROUP' wurde ein nicht boolescher Ausdruck in einem Kontext angegeben, in dem eine Bedingung erwartet wird. Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 10. Dezember 2014 Melden Teilen Geschrieben 10. Dezember 2014 Beispiel A ist recht einfach, probier es erstmal damit. Notfalls ein paar Datensätze in einer temporären Tabelle manuell anlegen. http://msdn.microsoft.com/de-de/library/ms179916.aspx Zitieren Link zu diesem Kommentar
istuggi 0 Geschrieben 10. Dezember 2014 Autor Melden Teilen Geschrieben 10. Dezember 2014 das bringt mir ehrlich nichts, die seite bin ich hoch und runter gegangen. Mit meiner oben angegebenen Abfrage kommt zumindest mal das was ich brauche an Informationen nur zu viele Ergebnisse, weil ja nicht gebrenzt auf das Datum. Ich müsste nur noch das MIN einbauen, nur wie fehlt mir. Und die Beispiele bringen mich nicht weiter. Wäre nett, wenn Du mir das MIN in meine Abfrage einbauen könntest und evtl. eine Erklärung warum. Danke Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 10. Dezember 2014 Melden Teilen Geschrieben 10. Dezember 2014 In diesem Thread findest Du die passende Antwort: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a8936440-32af-45b0-a774-ba23b78ef699/select-the-record-with-the-lowest-datediff Das Top 1 ist wichtig: SELECT TOP 1 .... MIN(DATEDIFF(DAY,mz.Meldedatum,'01.05.2014') AS Differenz Zitieren Link zu diesem Kommentar
istuggi 0 Geschrieben 10. Dezember 2014 Autor Melden Teilen Geschrieben 10. Dezember 2014 mit TOP 1 kommt ja nur ein Datensatz als Ergebnis. Ich brauche ja pro Maschinennummer den jeweiligen Datensatz. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.