2017-07-27 3 views
1

Ich habe die folgende Tabelle mit Start- und Enddaten:Verwendung datediff() Ergebnis in Funktion DSum()

dataid  TS     EndTS   
1744 7/27/17 1:57:34 PM 7/27/2017 1:57:38 PM  
1743 7/27/17 1:57:31 PM 7/27/2017 1:57:34 PM 
1742 7/27/17 1:57:23 PM 7/27/2017 1:57:31 PM  
1741 7/27/17 1:57:16 PM 7/27/2017 1:57:23 PM 
1740 7/27/17 1:57:04 PM 7/27/2017 1:57:16 PM  
1739 7/27/17 1:56:57 PM 7/27/2017 1:57:04 PM  
1738 7/27/17 1:56:38 PM 7/27/2017 1:56:57 PM 

Ich möchte das Datum/Zeitintervall (in Sekunden) bekommen und dann einen laufenden berechnen gesamt. Hier

ist das, was ich bisher:

SELECT 
    [dataid] AS [dataid] 
    DateDiff("s", [TS],[EndTS]) AS [durationsec] 
    DSum("[durationsec]","[HX32]","[dataid] <=" & [dataid]) AS [add] 

FROM [HX32]; 

Ich denke, die datediff() funtion möglicherweise verursacht Formatierungsprobleme. Mit "[durationsec]" bekomme ich alle NULL-Werte als Ergebnis mit [durationsec] ich die folgenden Ergebnisse erhalten:

durationsec add 
     4 6896 
     3 5169 
     8 13776 
     7 12047 
     12 20640 
     7 12033 
     19 32642 

Ich habe auch versucht cint(DateDiff("s", [TS],[EndTS])) Keine Änderung. Ich habe auch versucht, durationsec an eine Tabelle zu übergeben und eine separate Abfrage auszuführen. Keine Änderung. (Auch ich würde es vorziehen, diese in einer Abfrage zu tun)

Hier sind die Ergebnisse Ich mag würde erreichen:

dataid  TS     EndTS   durationsec add 
1744 7/27/17 1:57:34 PM 7/27/2017 1:57:38 PM 4  60 
1743 7/27/17 1:57:31 PM 7/27/2017 1:57:34 PM 3  56 
1742 7/27/17 1:57:23 PM 7/27/2017 1:57:31 PM 8  53 
1741 7/27/17 1:57:16 PM 7/27/2017 1:57:23 PM 7  45 
1740 7/27/17 1:57:04 PM 7/27/2017 1:57:16 PM 12  38 
1739 7/27/17 1:56:57 PM 7/27/2017 1:57:04 PM 7  26 
1738 7/27/17 1:56:38 PM 7/27/2017 1:56:57 PM 19  19 

Dank, ich bin ein Anfänger.

+0

ich durch Ausführen dsum in einer anderen Abfrage gelöst nach datediff berechnen. Es scheint, dass Sie einen generierten value datediff-Wert in derselben Abfrage nicht an dsum übergeben können oder eine datafiff-Funktion in einer dsum-Funktion haben. –

+0

Ich habe gerade getestet und es funktioniert mit DateDiff im DSum geschachtelt. Bearbeitete meine Antwort, um das volle SQL zu zeigen. – June7

Antwort

1

DSum sucht in der [HX32] Tabelle oder Abfrage nach einem Feld namens [durationsec]. Es existiert dort nicht.

SELECT 
    [dataid], 
    DateDiff("s",[TS],[EndTS]) AS [durationsec], 
    DSum("DateDiff('s',[TS],[EndTS])","[HX32]","[dataid] <=" & [dataid]) AS [add] 
FROM [HX32];` 

Beachten Sie die Verwendung von Apostrophen zum Abgrenzen des Parameters 's' in der geschachtelten DateDiff.

Ein alternativer Ansatz ist das Ausführen der Summe in Report, da das Textfeld im Bericht über eine RunningSum-Eigenschaft verfügt. Domänenaggregatfunktionen in Abfragen können in großen Datenmengen langsam ausgeführt werden.

+0

Was Sie sagen, macht insgesamt Sinn, aber ich bekomme immer noch alle Nullen als Ergebnis für 'add' –

+0

Ich erstellte Tabelle mit Ihren Beispieldaten und Abfrage arbeitet mit verschachtelten DateDiff. Bearbeitete Antwort, um vollständiges SQL und mehr Info anzuzeigen. – June7

1

Zeit ist nicht Sekunden, aber integer Tage, so dass Sie könnten versuchen:

SELECT 
    [dataid], 
    DateDiff("s", [TS], [EndTS]) AS [durationsec], 
    DSum("[EndTS]-[TS]", "[HX32]", "[dataid] <= " & [dataid] & "") * 86400 AS [add] 
FROM 
    [HX32]; 

Das heißt, sollte der Juni-Methode auch funktionieren. Wenn beides scheitert, passiert etwas anderes.

+0

Ich habe beide versucht (gleiche Ergebnisse). Vielleicht ist etwas anderes los. Ich habe eine neue Tabelle erstellt und frage von Grund auf nach Tests. Danke für deinen Beitrag. –

1
SELECT dataid, 
     startts, 
     endts, 
     DATEDIFF("s", startts,endts) AS durationsec, 
     SUM(DATEDIFF("s", startts,endts)) OVER (ORDER BY endts ROWS UNBOUNDED PRECEDING) AS runningtotal 
    FROM durtab 
ORDER BY 5 DESC; 

Ergebnis:

dataid startts endts durationsec runningtotal 
1744 2017-07-27 13:57:34.000 2017-07-27 13:57:38.000 4 60 
1743 2017-07-27 13:57:31.000 2017-07-27 13:57:34.000 3 56 
1742 2017-07-27 13:57:23.000 2017-07-27 13:57:31.000 8 53 
1741 2017-07-27 13:57:16.000 2017-07-27 13:57:23.000 7 45 
1740 2017-07-27 13:57:04.000 2017-07-27 13:57:16.000 12 38 
1739 2017-07-27 13:56:57.000 2017-07-27 13:57:04.000 7 26 
1738 2017-07-27 13:56:38.000 2017-07-27 13:56:57.000 19 19 
+0

Funktioniert das in MS-Zugriff? (Ich benutze 2010), es gibt mir eine Syntax (fehlender Operator) Fehler an der OVER() func –

+1

Access erkennt nicht alle SQL-Funktionen oder Operationen. – June7