2010-11-03 2 views
1

Je dois sélectionner tous les enregistrements de ma base de données SQL Server compris entre une certaine heure. Laissez-moi vous donner un exemple:Sélection des enregistrements en fonction de l'heure actuelle entre ProgramStart et ProgramEnd

L'heure actuelle est 09h33 et vous avez de nombreux enregistrements de programme dans la base de données qui ont un ProgramStart et ProgramEnd. Un exemple des dates pourrait être:

| ProgramStart    | ProgramEnd    | ClientID | 
+--------------------------+-------------------------+----------+ 
| 1900-01-01 09:00:00.000 | 1900-01-01 10:00:00.000 | 5  | 
+--------------------------+-------------------------+----------+ 
| 1900-01-01 11:00:00.000 | 1900-01-01 13:00:00.000 | 4  | 
+--------------------------+-------------------------+----------+ 
| 1900-01-01 12:00:00.000 | 1900-01-01 14:00:00.000 | 5  | 
+--------------------------+-------------------------+----------+ 
| 1900-01-01 11:00:00.000 | 1900-01-01 13:00:00.000 | 6  | 
+--------------------------+-------------------------+----------+ 
| 1900-01-01 16:00:00.000 | 1900-01-01 17:00:00.000 | 7  | 
+--------------------------+-------------------------+----------+ 
| 1900-01-01 16:00:00.000 | 1900-01-01 17:00:00.000 | 5  | 
+--------------------------+-------------------------+----------+ 
| 1900-01-01 17:00:00.000 | 1900-01-01 18:00:00.000 | 4  | 
+--------------------------+-------------------------+----------+ 

Je veux extraire tous les enregistrements pour le client 5 et entre l'heure actuelle qui est 09h33

Comment peut-on faire avec SQL. J'ai essayé ceci, mais cela ne fonctionne pas:

SELECT CAST('1900-01-01 09:33:00.000' AS datetime) AS TimeNow, * FROM Programs 
WHERE ClientID = 5 
AND TimeNow BETWEEN '1900-01-01 09:00:00.000' AND '1900-01-01 10:00:00.000' 

toute suggestion serait grandement appréciée.

Un grand merci, Paul

Répondre

2
select * 
    from Programs 
    where ClientId = 5 
     and DATEADD(Day, 0-DATEDIFF(Day, 0, GetDate()), GetDate()) between ProgramStart and ProgramEnd 
1

Essayez:

SELECT * 
FROM Programs 
WHERE ClientId = 5 
AND GETDATE() BETWEEN ProgramStart AND ProgramEnd 

Mise à jour Je n'ai pas remarqué l'absence d'une composante de date dans les données. Vous devriez regarder la réponse de gbn pour gratter la date après avoir appelé GetDate(). Je ne vais pas simplement copier son code ici parce que cela semble faux. :)

+0

-1. Comment est-ce que '03 Nov 2010 20: 10.xx.yyyy' * ever * peut être entre '1900-01-01 09: 00: 00.000' et' 1900-01-01 10: 00: 00.000'? Modifier: -1 supprimé. – gbn

+0

Oui, je n'ai pas remarqué ça jusqu'à ce que j'ai vu d'autres réponses. –

2

Ce mais va supprimer le composant date de GETDATE:

DATEADD(day, -DATEDIFF(DAY, 0, GETDATE()), GETDATE()) 

branchent ceci dans la requête

SELECT 
    * 
FROM 
    Programs 
WHERE 
    ClientID = 5 
    AND 
    DATEADD(day, -DATEDIFF(DAY, 0, GETDATE()), GETDATE()) 
       BETWEEN ProgramStart AND ProgramEnd 

Sur SQL Server 2008+ vous avez le type de données temps aussi. Cependant, le triple CAST un index sur invaliderait ProgramStart et ProgramEnd il avait la peine de jouer avec quelque chose comme le 2ème

CAST(GETDATE() AS time) BETWEEN CAST(ProgramStart AS time) AND CAST(ProgramEnd AS time) 
CAST(CAST(GETDATE() AS time) AS smalldatetime) BETWEEN ProgramStart AND ProgramEnd 
+0

+ 1 Battez-moi de 56 secondes. –