2009-12-16 4 views
2

Je dois joindre ma table de données à un fichier de calendrier de serveur (a défini des dates fiscales, des périodes, etc.). Je ne reçois aucun résultat et crois que c'est parce que ma table a date/heure comme "23/11/2009 11:30:34 AM" et le fichier de calendrier a seulement date/heure comme "23/11/2009", donc les champs ne sont pas identiques.table se joint à Access 2003 sur le champ de date-heure

SQL actuelle se lit comme: De tbl_data Inner Join tbl_calendar sur tbl_data.TRXdate = tbl_calendar.TRXdate

des idées?

+0

De quel environnement utilisez-vous votre SQL? A partir d'Access ou d'une autre programmation d'environnement d'interrogation? –

Répondre

0

Une autre possibilité:

FROM tbl_data 
INNER JOIN tbl_calendar 
ON tbl_calendar.TRXdate = CDate(Format(tbl_data.TRXdate,"yyyy/mm/dd")) 

Cela ne peut pas être modifié dans la fenêtre de création de la requête, sauf en mode SQL. Le calendrier se trouve à gauche du signe égal pour tirer parti des index.

1

Pensez à utiliser la fonction DateValue pour extraire uniquement la « partie date » de votre valeur date/heure:

? DateValue(#11/23/2009 11:30:34AM#) 
11/23/2009 

Cependant, DateValue retourne en fait une date/valeur heure de minuit de la date en question:

? Format(DateValue(#11/23/2009 11:30:34AM#), "mm/dd/yyyy hh:nn:ss") 
11/23/2009 00:00:00 

donc voir si une expression de jointure comme celui-ci obtient ce que vous voulez:

FROM tbl_data 
INNER JOIN tbl_calendar 
ON tbl_calendar.TRXdate = DateValue(tbl_data.TRXdate) 
+0

+1 - Je pense que c'est le meilleur moyen. –

2

L'utilisation de fonctions dans les jointures n'utilise pas d'index. Vous pouvez faire cela, au lieu (en supposant tbl_data est la table avec des pièces de temps dans ses données):

SELECT * 
    FROM tbl_data, tbl_calendar 
    WHERE tbl_data.TRXdate >= tbl_calendar.TRXdate 
    AND tbl_data.TRXdate < tbl_calendar.TRXdate + 1 

Cela utilisera les indices des deux côtés (mais pas nécessairement pour les deux critères). La raison de ne pas utiliser l'opérateur BETWEEN/AND est que de nombreux moteurs de base de données considèrent le deuxième argument comme inclusif, ce qui vous permet d'obtenir deux jours au lieu d'un seul.

suggestions spéculatives:

  1. ADO permet la création d'index virtuels sur recordsets, donc en fonction de ce que vous essayez de faire ici, vous pourriez peut-être accélérer en créant un index virtuel sur un champ calculé, Int (tbl_calendar.TRXdate). Je n'ai jamais fait ça, sache juste que c'est possible.

  2. Certains moteurs de base de données permettent la création d'index virtuels sur les vues. Dans SQL Server, il s'agit d'une vue indexée qui vous permet de créer une vue avec l'expression Int (tbl_calendar.TRXdate) indexée. Du côté serveur, les tables temporaires peuvent également être une solution, mais le fonctionnement des vues indexées évite d'en avoir besoin, car il enregistre la vue indexée en tant que table.

  3. En fonction de l'autre base de données, les index peuvent être utilisés ou non. L'efficacité avec laquelle ils seront utilisés dans une jointure hétérogène dépendra des moteurs db impliqués, et de ceux que vous utiliserez pour exécuter le SQL SELECT. Si, par exemple, le côté serveur est SQL Server, il se peut que vous obteniez de meilleures performances en l'exécutant à partir de SQL Server avec le fichier de données Jet/ACE en tant que serveur lié.Ma supposition est qu'il y a des optimisations pour exactement ce genre de situation qui rendrait probablement plus efficace à partir de SQL Server qu'à partir de Jet, mais vous devrez tester pour être sûr. Une autre option consiste à remplir une table temporaire dans votre base de données Access à deux colonnes, la PK de la table côté serveur et la valeur Int (tbl_calendar.TRXdate) calculée à partir des données du serveur. Si vous indexiez cela, vous obtiendriez de très bonnes performances dans la sélection des données Jet/ACE. Mais si vous avez besoin de retourner les données côté serveur, vous n'obtiendrez probablement pas de résultats aussi bons, mais ils pourraient être meilleurs que n'importe laquelle des alternatives ci-dessus.

Questions connexes