2010-11-17 21 views
1

Voici la requête qui est en cours d'exécution sur SQL Server 2008:requête d'accès pour les tables dans liés SQL Server DB pas de données de retour pour la recherche des valeurs datetime fois

SELECT "dbo"."tblMainData"."recID" 
FROM "dbo"."tblMainData" 
WHERE ("timeInMain" BETWEEN {t '08:00:00'} AND {t '17:00:00'}) 

Cette requête est générée par un Microsoft Access 2007 base de données qui a lié des tables dans la base de données SQL Server 2008.

Voici la requête d'accès qui génère la requête ci-dessus:

SELECT tblMainData.timeInMain 
FROM tblMainData 
WHERE (((tblMainData.timeInMain) Between #12/30/1899 8:0:0# And #12/30/1899 17:0:0#)); 

Quoi qu'il en soit, je sais qu'il ya des données qui répond à ce critère. Pourquoi ne vois-je pas les résultats attendus?

C'est la première fois que j'ai vu la syntaxe {t '08:00:00'}, que je suppose supposée ignorer la partie date du champ datetime. Je n'ai trouvé aucune documentation à ce sujet.

Merci pour toute aide.

MISE À JOUR

juste couru select {t '08:00:00'} dans SSMS, qui est revenu 2010-11-17 08:00:00.000. Cela explique pourquoi je ne récupère pas de données. Mais, comme vous pouvez le voir, la requête Access est explicite sur la date à utiliser et le TSQL généré ne l'inclut pas. Que faire?

MISE À JOUR 2

J'ai fait quelques expériences. L'accès supprime uniquement la date de TSQL généré lorsqu'il est 12/30/1899. Apparemment, il s'agit d'une date spéciale que l'accès utilise lorsqu'un utilisateur stocke uniquement une heure dans un champ DateTime et Access suppose que s'il est inclus dans une requête, il n'est pas vraiment important. Sensationnel.

Alors, je crois que mes options sont:

  1. Appel des procédures stockées à partir d'Access. Je ne suis pas sûr de savoir comment le faire pour le moment.
  2. Mettez à jour les données dans la base de données du serveur SQL avec une date qui ne sera pas supprimée lors de la génération de TSQL. Essayez de trouver un moyen de faire en sorte que les TSQL générés incluent la date explicite du 30/12/1899. IDEAL

Autres idées?

+2

Les accolades sont une séquence d'échappement ODBC pour le moment. Voir: [Séquences d'échappement de date, d'heure et d'horodatage] (http://msdn.microsoft.com/fr-fr/library/ms712360.aspx) –

+0

Est-il possible d'émettre des requêtes TSQL directement ou est-ce toujours le cas? accéder à l'étape de traduction? – Donnie

+0

@Donnie - Je ne sais pas. Je n'utilise presque jamais Access. J'essaie de résoudre ce problème pour un ami. –

Répondre

1

Vous pouvez modifier votre clause where à la suivante qui supprime la date sur le côté gauche de la comparaison

WHERE TimeValue(tblMainData.timeInMain) Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0#

Si vous savez que toutes les valeurs de la base de données seront sur 12/30/1899 que vous pouvez juste faire

WHERE tblMainData.timeInMain Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0#

en aparté, si vous voulez faire dans la procédure SQL Server, vous pouvez dépouiller la date en utilisant ce qui suit (son pas beaucoup plus lent que si vous saviez les dates)

WHERE 
     DATEADD(DAY , -1 *DATEDIFF(DAY, 0, timeInMain) , timeInMain) 
        BETWEEN '09:00' and '17:00' 

MISE À JOUR

Voici comment je l'ai testé

J'ai créé une table et peuplée en utilisant les éléments suivants dans SQL Server

CREATE Test 
( 
    id int identity, 
    DateTimeValue DateTime 
) 

--Values with COM Zero Date 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 8:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 9:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 10:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 11:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 12:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 1:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 2:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 3:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 4:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 5:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 6:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 7:00 PM') 

--Values with SQL Zero Date 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 8:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 9:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 10:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 11:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 12:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 1:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 2:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 3:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 4:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 5:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 6:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 7:00 PM') 

--Abritrary Date After Zero Dates 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 8:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 9:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 10:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 11:00 AM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 12:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 1:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 2:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 3:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 4:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 5:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 6:00 PM') 
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 7:00 PM') 

J'ai créé un ODBC lien vers cette table dans MS Access 2007

Et puis créé la requête suivante qui se traduit par les 27 enregistrements qui ont une valeur de temps 9h00-17:00

SELECT id, DateTimeValue 
FROM dbo_Test 
WHERE TimeValue(DateTimeValue) Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0# 
+1

Cela a également l'effet secondaire potentiellement horrible de désactiver également les index sur la colonne 'timeInMain' pour cette requête. – Donnie

+0

Et à part ça, ça ne marche pas: http://i.imgur.com/k7CYm.png –

+0

En utilisant # au lieu de "autour du temps, les littéraux n'aident pas –