2017-01-07 32 views
0

Ich habe die folgende DatenbankErhalten Sie Datensätze zwischen zwei Daten mit überlappenden Zeitintervallen

CREATE TABLE `table` (
`id` int(10) NOT NULL AUTO_INCREMENT, 
`time` bigint(20) DEFAULT NULL, 
`name` varchar(20) DEFAULT NULL, 
`messages` varchar(2000) NOT NULL, 
PRIMARY KEY (`id`) 
) 
INSERT INTO `table` VALUES (1,1467311473,"Jim", "Jim wants a book"), 
         (2,1467226792,"Tyler", "Tyler wants a book"), 
         (3,1467336672,"Phil", "Phil wants a book"); 

Ich brauche die Datensätze zwischen Datum 29. Juni 2016 und 1. Juli 2016 für Zeitintervalle 18.59.52 bis 01 zu erhalten: 31:12. Ich schrieb eine Abfrage, aber es gibt nicht die gewünschte Ausgabe

SELECT l.* 
FROM table l 
WHERE ((time >=1467226792) AND (CAST(FROM_UNIXTIME(time/1000) as time) >= '18:59:52') AND (CAST(FROM_UNIXTIME(time/1000) as time) <= '01:31:12') AND (time <=1467336672)) 

Irgendwelche Vorschläge ??

+0

werfen Sie Ihre Zeitstempel Datetimes. –

+1

Ich bin wirklich verwirrt. Was ist "emd_date" und "start_date"? Warum haben Sie String-Konstanten? Welche Spalten kommen vom Tisch? Beispieldaten und gewünschte Ergebnisse würden helfen. –

+0

@GordonLinoff die Abfrage funktioniert nicht, wenn start_date = 21:30:00 und end_date ist 03:30:00 – Unaffected

Antwort

2

Wie ich es verstehe, sind Sie einfach zu allen Zeiten interessiert mehr als ‚2016.06.29 18.59.52‘ und weniger als ‚2016-07 -01 01.31.12' , wo das Zeitelement nicht zwischen '01: 31: 12' und '18: 59: 52'

ich glaube, Sie diese Logik in sQL ohne weitere Unterstützung wenden können

Ah, nun, hier ist eine Geige - die ganzen Sachen von_untimetime() wurden weggelassen, weil das Verständnis des Problems unnötig komplizierter wird - b ut diese Lösung für Ihre Bedürfnisse anzupassen ist buchstäblich nur ein Fall von vor jeder Instanz der Spalte time mit dieser Funktion:

http://rextester.com/OOGWB23993

+0

Dies würde die Ergebnisse zwischen '2016-06-29 18:59:52 geben 'und' 2016-07-01 01:31:12 'also auch die Ergebnisse für 2016-06-30 für die Zeit größer als 01:31:12 und weniger als 18:59:52, die nicht erforderlich ist. Das Zeitintervall für alle Tage ist von 18:59:52 bis 01:31:12 und schließt alle anderen aus, die nicht zwischen diesen Zeiten liegen. – Unaffected

+0

Ähm, vielleicht lies ich meine Antwort nochmal durch – Strawberry

+0

yeah funktioniert gut – Unaffected

0

Wenn ich es richtig

SELECT l.* 
FROM `table` l 
WHERE time >=1467226792 
     AND time <=1467336672 
     AND CAST(FROM_UNIXTIME(time/1000) as time) >= '18:59:52' 
     AND FROM_UNIXTIME(time/1000) <= DATE_ADD(DATE_ADD(DATE_ADD(CAST(FROM_UNIXTIME(time/1000) as date), INTERVAL 25 HOUR), INTERVAL 31 MINUTE), INTERVAL 12 SECOND) 
+0

Das Casting/"Zeit/1000" Zeug ist sicherlich nicht notwendig – Strawberry

+0

Darüber hinaus kompliziert diese Lösung (wenn richtig) über das Problem – Strawberry

Verwandte Themen