2011-01-05 10 views
2

SQL ist nicht meine größte Stärke und ich brauche etwas Hilfe bei der Erstellung einer Select-Anweisung.Hilf mir, eine SQL-Select-Anweisung zu erstellen

Grundsätzlich ist dies meine Anforderung. Die Tabelle speichert eine Liste von Namen und einen Zeitstempel, wann der Name in die Tabelle eingegeben wurde. Namen können mehrmals pro Woche eingegeben werden, aber nur einmal am Tag.

Ich möchte die Select-Abfrage Namen zurückgeben, die jederzeit in den letzten 7 Tagen, aber nicht heute eingegeben wurden.

Um eine Liste der Namen eingegeben heute zu bekommen, das ist die Aussage, die ich habe:

Select * from table where Date(timestamp) = Date(now()) 

Und eine Liste der Namen in den letzten 7 Tagen ohne heute eingegeben zu bekommen:

Select * from table where (Date(now())- Date(timestamp) < 7) and (date(timestamp) != date(now())) 

Wenn die erste Abfrage einen Satz oder Ergebnisse zurückgibt, sagen A, und die zweite Abfrage gibt B, wie kann ich

B-A 

Antwort

3

Im Klartext möchten Sie Datensätze aus Ihrer zweiten Abfrage, wo der Name nicht in Ihrer ersten Abfrage ist. In SQL:

Select * 
    from table 
    where (Date(now())- Date(timestamp) < 7) 
     and (date(timestamp) != date(now())) 
     and name not in (Select name 
          from table 
          where Date(timestamp) = Date(now()) 
         ) 
+0

funktioniert wunderbar! Ich danke dir sehr. – xbonez

1
erhalten 210

wie

select pk from B where PK not in A 

oder Sie können wie etwas tun

Select * from table where (Date(now())- Date(timestamp) < 7) and (Date(now())- Date(timestamp) > 1) 
+0

Die folgende Abfrage gibt alle Namen zurück, die von Tag D-1 bis Tag D-7 eingegeben wurden. Aber aus dieser Reihe von Ergebnissen muss ich immer noch alle Ergebnisse ausschließen, die am Tag D eingegeben wurden. Danke, dass Sie es trotzdem versuchen. – xbonez

+0

war nicht sicher, welchen Weg du meintest. Warum sollten sie Namen ausschließen wollen, nur weil sie heute betreten wurden? aber da sie es tun, müssen Sie NOT IN verwenden, wie in Joes Beispiel. – Beth

4

die Sie interessieren, wenn Sie mit SQL Server arbeiten:

SELECT * FROM Table 
WHERE Timestamp BETWEEN 
     dateadd(day,datediff(day,0,getdate()),-7), 
    AND dateadd(day,datediff(day,0,getdate()),0) 

Dies stellt sicher, dass der Zeitstempel zwischen 00:00 vor 7 Tagen und 00:00 heute. Heutige Einträge mit einer Zeit größer als 00:00 werden nicht berücksichtigt.

+0

Ich könnte falsch sein, aber, wie ich die Frage lese, ist die Anforderung, Namen auszuschließen, die in den vorherigen 7 Tagen eingegeben wurden und auch heute eingegeben. –

+0

@Joe: Ich ging auch auf die Frage zurück. "... gib Namen zurück, die in den letzten 7 Tagen eingegeben wurden, aber nicht heute" –

+0

Joe hatte Recht bei seiner Interpretation meiner Frage. Als ich jedoch zurückging, um meine Frage zu lesen, wurde mir klar, dass ich es zweideutig formuliert hatte. Entschuldigung und danke, dass du versucht hast, trotzdem zu helfen. – xbonez

Verwandte Themen