2017-10-21 1 views
0

Ich habe eine Spalte mit Datentyp als Datetime und die Art, wie Daten importiert wird, ist immer der vorherige Tag bis heute.Wo datetime zwischen 12 Uhr der Spalte Zeit und 10 Uhr am nächsten Tag der Spalte Zeit

In der Tabelle sind keine historischen Daten gespeichert - die vorherigen Daten werden gelöscht, bevor die neuen Daten importiert werden.

Ich möchte eine where-Klausel geschrieben haben, wobei meine ESTendTime-Spalte zwischen 00:00:00 der Zeitstempelspalte und 10:00:00 am nächsten Tag der Zeitstempelspalte liegt.

Ich habe gesucht, konnte aber nichts bestimmtes zu dem finden, was ich suchte.

Der Zweck ist, in erster Linie die Endzeiten derjenigen zu erfassen, die über Nacht arbeiten. Wenn die Daten exportiert werden, werden sie immer wie am Vortag zum nächsten Tag exportiert, zum Beispiel vom 1. Oktober zum 2. Oktober. Dadurch können wir die letzten Abmeldezeiten derjenigen sehen, die über Nacht gearbeitet haben. In dem Beispiel, das ich gerade erwähnt habe, werden die Daten alles von 00:00:00 1. Oktober bis 23.59.59 2. Oktober enthalten. Es gibt keine Möglichkeit für uns, sich auf eine bestimmte Zeit zu beschränken. Wenn ich also das Beispiel nutze, in dem ich gehofft habe, ist es in einer Where-Klausel begrenzt, wo die Zeit zwischen 00:00:00 Oktober 1 und 10:00:00 Oktober 2 ist. Das Problem ist, dass ich diese nicht verwenden möchte Daten wie meine Daten ändern sich ständig, weshalb ich hier für etwas Hilfe bin.

Code, ich habe aber nicht die erwarteten Ergebnisse zu erzielen

SELECT timestamp, emp_id, dept, ESTStartTime, ESTEndTime 
    ,CONCAT(emp_id, '-', FORMAT(ESTStartTime, 'yyyy/MM/dd-HH:mm')) AS Index2Start 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd-HH:mm')) AS Index3Stop 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd')) AS Index3StopDay 

FROM   dbo.[test] 
WHERE ESTEndTime BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, timestamp), 0) + '00:00' 
      AND DATEADD(DAY, DATEDIFF(DAY, 1, timestamp), 1) + '10:00' 
ORDER BY ESTEndTime DESC 
+0

Beitrag versuchen, kann der Code, den Sie bisher geschrieben bitte. –

+0

"wobei meine Datetime-Spalte zwischen 00:00:00 der Datetime-Spalte und 10:00:00 am nächsten Tag der Datetime-Spalte liegt." Das ergibt keinen Sinn. –

+0

Ja, Sie haben Recht, und was ich meinte ist, wo meine ESTendTime-Spalte zwischen 00:00:00 der Zeitstempelspalte und 10:00:00 dem Tag der Zeitstempelspalte liegt. – sly123

Antwort

0

Hier ist eine weitere Möglichkeit, Sie

SELECT DISTINCT ee.* 
FROM table ee 
CROSS APPLY (
    select MIN(timestamp) AS timestamp, NextDate = DATEADD(HOUR,10,DATEADD(DAY,1,MIN(timestamp))) from table 
) maxdate 
WHERE ee.ESTEndTime BETWEEN maxdate.timestamp AND maxdate.NextDate 
+0

Danke Spuckfeuer. Das hat auch funktioniert. Sehr geschätzt – sly123

0

sehen, ob dies für Sie arbeiten. Ich habe 2 Variablen deklariert, um das Datum und die Uhrzeit des Vortags und das Datum und die Uhrzeit des aktuellen Tages zu speichern. Ich habe GETDATE() verwendet, um das aktuelle Datum und die Uhrzeit zu erhalten. Ich extrahierte den Datumsteil daraus und subtrahierte einen Tag für das vorherige Datum. Dann habe ich das Datum in eine VARCHAR umgewandelt und die Zeit hinzugefügt. SQL Server konvertiert die Zeichenfolge implizit zurück in einen DATETIME Wert.

--Previous day at 12:00am 
DECLARE @prevday DATETIME = CONVERT(VARCHAR,CONVERT(DATE,(DATEADD(DD,-1,GETDATE())))) + ' 12:00AM'; 
--Current day at 10:00am 
DECLARE @currentday DATETIME = CONVERT(VARCHAR,CONVERT(DATE,GETDATE())) + ' 10:00 AM' ; 

SELECT timestamp, emp_id, dept, ESTStartTime, ESTEndTime 
    ,CONCAT(emp_id, '-', FORMAT(ESTStartTime, 'yyyy/MM/dd-HH:mm')) AS Index2Start 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd-HH:mm')) AS Index3Stop 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd')) AS Index3StopDay 

FROM   dbo.[test] 
WHERE ESTEndTime BETWEEN @prevday AND @currentday 
ORDER BY ESTEndTime DESC 
+0

Danke Jason. Das hat mein Problem gelöst. Sehr geschätzt – sly123

Verwandte Themen