2011-09-23 1 views
4

Mon mémoire est d'implémenter une interface qui a une méthode qui ressemble à quelque chose comme « GetValuesSqlStatement » ci-dessous:Quelle est la meilleure pratique pour interroger les dates dans SQL lorsque les requêtes paramétrées ne sont pas possibles

public string SqlPattern { get { ... } } 
//this varies; eg. "SELECT name FROM someTable WHERE startDate < {0}" 

public string DatabaseType { get { ... } } 
//this varies; eg. "SqlServer" 

public string GetValuesSqlStatement(List<object> paramValues) 
{ 
    //...desired logic here, using DatabaseType, SqlPattern and paramValues 
} 

maintenant, parce que cela Je dois produire une instruction SQL exécutable, je ne peux pas utiliser de paramètres dans l'exécution de la requête. Et l'interface que je dois mettre en œuvre est non négociable. Quelle est la meilleure façon de procéder pour s'assurer que les dates du résultat sont interprétées correctement par le moteur de recherche de la base de données? En supposant que les paramValues ​​contiennent des objets .NET DateTime, comment devraient-ils être formatés en chaîne avant de se connecter à la chaîne de modèle SQL? Quel est le format de date universel le plus courant parmi les bases de données must? (par exemple quelque chose comme 'jj-mmm-aaaa'). NB: J'ai seulement vraiment besoin de m'inquiéter à propos de SQL Server à partir de 2005 et d'Oracle à partir de 10g. Donc le SQL doit être valide T SQL et PL SQL et signifie la même chose dans les deux versions.

Répondre

1

Je pense que le seul format de date non ambigu pour SQL Server est AAAAMMJJ:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

http://www2.sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx

Oracle utilise une date « AAAA-MM-JJ «notation:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements003.htm#BABGIGCJ

Bien qu'il y ait peut-être une notation qui fonctionne pour les deux dans certains scénarios, je doute qu'il y en ait une qui fonctionne pour les deux avec tous les paramètres de serveur régionaux possibles.

Comme vous l'avez dit, YYYY-MON-DD peut être utile - c'est la valeur par défaut d'Oracle.

+0

Eh bien, j'ai la chaîne DatabaseType pour m'aider à construire cette requête. Si vous dites que 'aaaa-mm-jj' fonctionne pour tout sauf SQL Server que je peux utiliser la logique conditionnelle. Si 'aaaa-mon-dd' fonctionne à la fois dans SQL Server et Oracle, cela suffira bien sûr pour mes besoins, mais je ne pense pas que ce soit nécessairement une bonne pratique. – Lisa

+1

@Lisa, vous devrez expérimenter. Je n'ai jamais de serveurs français, et j'utilise toujours AAAA-MM-JJ. Vous verrez dans l'article d'Aaron et cet article de connexion qu'il ne s'applique pas aux nouveaux types de données date et datetime2. dans SQL Server. Selon mon expérience dans Oracle, les littéraux requièrent toujours le qualificateur DATE pour les distinguer des chaînes. Vous avez probablement besoin d'envelopper votre génération de chaîne de date dans quelque chose qui est spécifique à la base de données. –

+0

J'ai soudainement eu une meilleure idée, ce qui rend cette question peu utile. Je pourrais l'ajouter comme une troisième réponse, même si elle ne répond pas strictement à la question. – Lisa

1

Si vous utilisez le format de date 'aaaa-mm-jj' avec un DB, cela devrait fonctionner. Ceci est selon la norme ISO 8601 (http://www.iso.org/iso/date_and_time_format)

+1

Dans SQL Server, les problèmes demeurent http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx (Connect http: //connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=290971) –

+0

Je pense que ce sera le plus universel que vous pouvez obtenir. Connaissez-vous la localisation de vos serveurs? – mwan

+0

Partout dans le monde. OK pour ce projet particulier sera + 8GMT ou + 9.30GMT mais ne peut pas se permettre de ne pas soudainement ne pas fonctionner pour un client différent. – Lisa

0

Je fournis ma propre réponse à cette question, même si elle s'écarte de la portée de la question car elle pourrait être une suggestion utile pour d'autres personnes ayant une question similaire. Je viens de me rendre compte que je peux simplement m'attendre à ce que chaque instance (ou chaque client dans une autre partie du monde) spécifie une chaîne de format dans la dernière partie du paramètre place-holder. Par exemple. mise en œuvre:

public string SqlPattern { get { 
    return "SELECT name FROM someTable WHERE startDate < {0:yyyy-mm-dd}"; 
} } 

Et puis mon composant n'a pas besoin de s'inquiéter de la façon de formater la date du tout. Par défaut, je peux utiliser 'yyyymmdd' ou même mieux utiliser la culture du serveur pour choisir un défaut. Sinon, utilisez le modèle personnalisé. Ce serait une approche générique applicable à d'autres types qui ont besoin d'être formatés sur une chaîne pour SQL aussi.

Questions connexes