2009-09-02 9 views
1

J'ai une table contenant des rapports et la date et l'heure de leur création. Je voudrais créer un graphique pour comptabiliser le nombre de rapports créés pendant des intervalles de dix minutes entre deux périodes: 8h00-9h00 et 13h00-14h00.Sélection de plages de temps à partir des champs de date et heure dans Access

Voici un exemple d'une requête que je voudrais courir:

SELECT 
s.StudyStartDateTime AS "8:00 - 8:10", 
s.StudyStartDateTime AS "8:10 - 8:20", 
s.StudyStartDateTime AS "8:20 - 8:30", 
s.StudyStartDateTime AS "8:30 - 8:40", 
s.StudyStartDateTime AS "8:40 - 8:50", 
s.StudyStartDateTime AS "8:50 - 9:00", 
s.StudyStartDateTime AS "1:00 - 1:10", 
s.StudyStartDateTime AS "1:10 - 1:20", 
s.StudyStartDateTime AS "1:20 - 1:30", 
s.StudyStartDateTime AS "1:30 - 1:40", 
s.StudyStartDateTime AS "1:40 - 1:50", 
s.StudyStartDateTime AS "1:50 - 2:00" 
FROM 
    dbo_Study_ViewX211_Rpt AS s 
WHERE FORMAT("8:00 - 8:10", 'hh:mm:ss') BETWEEN "08:00:00" AND "08:09:59" 
AND FORMAT("8:10 - 8:20", 'hh:mm:ss') BETWEEN "08:10:00" AND "08:19:59" 
AND FORMAT("8:20 - 8:30", 'hh:mm:ss') BETWEEN "08:20:00" AND "08:29:59" 
AND FORMAT("8:30 - 8:40", 'hh:mm:ss') BETWEEN "08:30:00" AND "08:39:59" 
AND FORMAT("8:40 - 8:50", 'hh:mm:ss') BETWEEN "08:40:00" AND "08:49:59" 
AND FORMAT("8:50 - 9:00", 'hh:mm:ss') BETWEEN "08:50:00" AND "08:59:59" 
AND FORMAT("1:00 - 1:10", 'hh:mm:ss') BETWEEN "01:00:00" AND "01:09:59" 
AND FORMAT("1:10 - 1:20", 'hh:mm:ss') BETWEEN "01:10:00" AND "01:19:59" 
AND FORMAT("1:20 - 1:30", 'hh:mm:ss') BETWEEN "01:20:00" AND "01:29:59" 
AND FORMAT("1:30 - 1:40", 'hh:mm:ss') BETWEEN "01:30:00" AND "01:39:59" 
AND FORMAT("1:40 - 1:50", 'hh:mm:ss') BETWEEN "01:40:00" AND "01:49:59" 
AND FORMAT("1:50 - 2:00", 'hh:mm:ss') BETWEEN "01:50:00" AND "01:59:59" 

Malheureusement, il semble que l'accès ne peut pas dire que le domaine que je voudrais formater dans la fonction FORMAT fait référence au champ du même nom dans la requête. Dans le cas ci-dessus, je suppose que c'est parce qu'Access traite cela comme un littéral de chaîne. Toutefois, cela ne fonctionne pas, soit:

SELECT 
    s.StudyStartDateTime AS first 
FROM 
    dbo_Study_ViewX211_Rpt AS s 
WHERE FORMAT(first, 'hh:mm:ss') BETWEEN "08:00:00" AND "08:09:59" 

L'accès me demande la valeur de 'first'. Je me sens comme je vais à ce sujet la mauvaise façon de commencer. Est-ce que quelqu'un peut-il me montrer la bonne direction?

Plus d'infos: J'utilise le moteur Jet via ODBC, mais les données sont stockées dans SQL Server 2005, donc si nécessaire, je suppose que je pourrais écrire une requête directe. Idéalement, cependant, j'aimerais que cela fonctionne dans Access.

EDIT:

Pour être clair, ce qui suit fonctionne le:

SELECT s.StudyStartDateTime AS first 
FROM dbo_Study_ViewX211_Rpt AS s 
WHERE FORMAT(StudyStartDateTime,'hh:mm:ss') Between "08:00:00" And "08:09:59"; 

Ceci, cependant, ne me permet pas de sélectionner le même champ à plusieurs reprises dans plusieurs conditions.

Le premier exemple à http://office.microsoft.com/en-us/access/HA012288391033.aspx#examples suggère que enveloppant l'alias du champ dans des crochets est la bonne façon de faire référence à une source d'enregistrement, mais ce qui suit donne encore une invite pour la valeur de « première »:

SELECT s.StudyStartDateTime AS first 
FROM dbo_Study_ViewX211_Rpt AS s 
WHERE FORMAT([first],'hh:mm:ss') Between "08:00:00" And "08:09:59"; 

Edit II:

un exemple du contenu de StudyStartDateTime de quelques enregistrements:

29/11/2007 8:06:00 AM 
30/11/2007 8:09:01 AM 
05/12/2007 8:06:51 AM 
06/12/2007 8:07:21 AM 

Accès voit fi champ comme un type de données "Date/Heure".

Mon objectif final est de représenter graphiquement le pointage pour chaque intervalle. Je pense que la façon la plus simple de le faire serait de simplement sélectionner chaque date/heure comme un alias différent. Par exemple:

8:00-8:10 8:10-8:20 8:20:8:30 ... 
======================================= 
8:01   
8:03 
      8:15 
         8:23 
         8:28 
         8:28 
... 
+0

Avez-vous regardé dans PARTITION()? –

Répondre

3

Le problème que vous rencontrez est que l'accès ne référence pas les champs par leurs alias dans la même requête. Cela signifie que vous ne pouvez pas affecter un alias dans la clause select et l'utiliser dans la clause where.

En ce qui concerne la première partie de votre question, vous pouvez essayer quelque chose comme ça

SELECT 
     sum(iif(FORMAT(s.StudyStartDateTime,'hh:mm:ss') 
       BETWEEN "08:00:00" AND "08:09:59",1,0)) as "8:00 - 8:10", 
     sum(iif(FORMAT(s.StudyStartDateTime,'hh:mm:ss') 
       BETWEEN "08:10:00" AND "08:19:59",1,0)) as "8:10 - 8:20", 
     ... 
    FROM dbo_Study_ViewX211_Rpt AS s 

Cela vous donnera un décompte pour chaque période de 10 minutes.

+0

Parfait. Je savais que j'allais à ce sujet dans le mauvais sens. Merci! – Richard

Questions connexes