2009-10-07 4 views
1

J'ai un formulaire contenant deux zones de texte pour la saisie par l'utilisateur. Les deux zones de texte ont le format de propriété défini sur "Date courte". L'un est la "date de début", et l'autre est la "date de fin". J'ai également plusieurs tables, chacune avec un champ DateTime ("studystartdatetime"). J'aimerais pouvoir interroger ces tables, mais limiter les résultats aux lignes dont les champs DateTime sont entre les dates entrées (inclus). Actuellement, la condition est la suivante:Access 2007: Interrogation du champ DateTime entre deux valeurs de date abrégée

WHERE s.studystartdatetime BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate 

Ceci, cependant, ne renvoie pas les lignes qui se sont produites sur la date de fin spécifiée.

J'ai essayé toutes les combinaisons de CDate, Format et DateValue que je pouvais penser pour envelopper le un ou tous ces domaines, mais je reçois toujours la même erreur cryptique:

The expression is typed incorrectly, or it is too complex to be evaluated. For example, a numeric expression may contain too many complicated elements. Try simplifying the expression by assigning parts of the expression to variables.

Quelques exemples des conditions que j'ai essayé:

WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate 

WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate 

WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd")) 

WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd")) 

WHERE DateValue(Format(s.studystartdatetime, "Short Date")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate 

Etc.

Toute entrée dans ce serait grandement apprécié :)

Répondre

2

Ce qui se passe, c'est que vos entrées de date courte produisent des valeurs de date et heure à minuit le jour de début de l'utilisateur. Ainsi, la plage 2009-1-1 à 2009-1-10 (ou tout autre format de date courte utilisé sur votre système) est à la recherche d'événements depuis le tout début du 1er janvier jusqu'au très début du 10 janvier et en excluant le les événements qui se sont produits plus tard le 10 janvier.

Pour corriger, ajoutez 1 à la date de fin que l'utilisateur met dans la recherche. Cette recherche se fera du tout début du 1er janvier au tout début du 11 janvier, incluant tous les événements du 10 janvier.

Enfin, les événements qui se sont produits à exactement minuit du 11 Janvier peuvent glisser à vos résultats de cette façon, donc au lieu d'utiliser ENTRE vous devez utiliser

studystartdatetime> = formes! FrmMain! Formes txtStartDate ET studystartdatetime < ! frmMain! txtEndDate + 1

+0

Je l'avais envisagé de cette façon, mais pour une raison quelconque, j'ai supposé qu'il était impossible d'ajouter à une valeur de date comme ça. Quoi qu'il en soit, merci! – Richard

0

La réponse de Larry était la bonne réponse pour vous, mais permettez-moi de faire ressortir certaines des questions soulevées ici.

  1. Vous devez faire la distinction entre le format de date et le stockage de date. Dans le moteur de base de données Jet/ACE (moteur de base de données par défaut d'Access), les dates sont stockées sous la forme d'un entier pour le jour et d'une partie décimale pour l'heure. C'est pourquoi vous pouvez ajouter un chiffre (ou une décimale) à une date et obtenir un résultat correct, car la partie entière de la représentation sous-jacente de la date représente les jours depuis le 30 décembre 1899 (la raison pour laquelle ce n'est pas Dec La situation est compliquée - quelqu'un a fait des erreurs dans le calcul des années bissextiles, et tout un tas de programmes ont été rédigés avec des hypothèses erronées au sujet de la date du 31 décembre 1899). "Date courte" est un format de date, le format standard m/j/aa (ou m/j/aaaa, selon vos paramètres locaux dans Windows et Access). Cela n'a rien à voir avec les valeurs de date sous-jacentes réelles stockées dans votre table, mais cela peut avoir un effet énorme si vous travaillez avec les résultats du formatage. Par exemple, Format (Date(), "m/d/aaaa") renvoie une chaîne, pas une valeur de date. C'est une chaîne qui peut être implicitement contrainte à une valeur de date, et on se fie très souvent à ce qui se passe de manière transparente.Mais vous devez toujours comprendre que la fonction Format() renvoie une chaîne, et cette chaîne ne sera pas toujours traitée comme une date. Jet/ACE SQL s'attend à ce que les dates formatées soient passées dans l'ordre américain, le m/d/yyyy contre-intuitif, au lieu du plus logique d/m/yyyy ou, mieux encore, la norme ISO aaaa/m /ré. Pour cette raison, chaque fois que vous exécutez votre application avec un environnement local non-US défini pour Windows, vous devez être explicite à propos de vos dates. Cela revient à transtyper vos dates dans un format non ambigu (d/mmm/yyyy fonctionne car il spécifie le jour en chiffres et le mois en lettres), ou traite toutes vos dates avec la fonction DateSerial(). Cela s'applique aux critères de date dans votre clause WHERE, ou n'importe où dans votre instruction SELECT que vous effectuez des calculs de date - passez la date dans les fonctions dans un format non ambigu ou avec DateSerial() et vous éviterez ce problème.

Questions connexes