2010-08-05 4 views
2

Une de mes de colonne de table nommée "la SetDate" de type DateTime semble que:Comment puis-je personnaliser le format de date

2010-08-02 02:55:58.420 

Le format DateTime de l'application semble que:

2/11/2010 

Le problème est :

Je passe une requête SQL à la base de données via l'application. La requête contient la clause WHERE qui compare SetDate à la date provenant de l'application.

colonne SetDate porte ce format: 2010-08-02 02:55:58.420
date passée de l'application porte ce format: 3/12/2010

J'ai juste besoin de comparer les deux dates sans le temps 2010-08-02 et 3/12/2010.
Puisqu'ils sont dans différents formats, je n'obtiens aucun disque de la base de données. J'utilise C# et T-SQL.

Des idées?

+1

L'application ne vous permet-elle pas d'envoyer des requêtes paramétrées? –

+1

Comment construisez-vous la requête dans votre application? Magasin proc? Requête paramétrée? ... – Jaime

+0

Dans mon cas, je suis en train de coder la requête temporairement. – user311509

Répondre

0

Essayez quelque chose comme:

SELECT 
    * 
FROM 
    YourTable 
WHERE 
    RTRIM(CONVERT(CHAR(19), SetDate, 101)) = '3/12/2010' 
+0

En exécutant la conversion sur la colonne plutôt que sur la valeur transmise, il est impossible d'utiliser un index. En outre, si vous comparez les dates en tant que chaînes, il est préférable d'utiliser un format neutre au langage (par exemple AAAAMMJJ), ce qui indique de nouveau une conversion de la valeur transmise de toute façon. –

+0

Je n'étais pas au courant du problème de l'indice, merci de le signaler. Toutefois, si la requête devait obtenir des enregistrements pour une date particulière, quel que soit le moment, je pense que vous auriez encore besoin d'exécuter une conversion sur la colonne et la valeur transmise. Dans le cas contraire, vous devrez rechercher des éléments entre la date/heure minimale et la date/heure maximale pour le même jour (ce qui peut être préférable car vous pouvez profiter de l'index). –

+0

Merci, en fait cette solution a fonctionné pour moi! – user311509

0

Dans votre clause Where, vous pouvez utiliser le membre Date de la classe DateTime DateTime.Now.Date. Il renvoie la date sans l'heure.

Tant que vous travaillez avec des objets de date (.net ou SQL Server), le format n'a pas d'importance, car c'est votre travail d'analyser la chaîne pour objecter ou inverser, en interne le format est non pertinent.

2

Utilisez-vous un SqlCommand pour exécuter votre requête?

Oui? Utilisez également SqlParameters pour vos utilisateurs/système d'entrée.

var setDate = DateTime.Now(); 

using (SqlCommand command = new SqlCommand("SELECT * FROM TableX WHERE SetDate > @SetDate", connection)) 
{ 
    // Add new SqlParameter to the command. 
    command.Parameters.Add(new SqlParameter("@SetDate", SqlDbType.DateTime, setDate)); 
    // Read in the SELECT results. 
    SqlDataReader reader = command.ExecuteReader(); 
    //More code 
} 
1

Sur votre clause WHERE pour DATETIME dans la base de données, vous devez faire quelque chose comme ceci. CONVERT (DATETIME, REDUIRE (VARCHAR (11), '2010-08-02 02: 55: 58,420))

0

La meilleure façon d'exécuter des requêtes DB à partir du code est d'appeler des procédures stockées, si possible. Toutefois, que vous le fassiez ou non, vous devez utiliser l'objet SqlParameter initialisé avec la date dont vous avez besoin.

DateTime dateToCheck = DateTime.Now; 
using(SqlCommand cmd //Set Command Here) 
{ 
    cmd.CommandType = SqlCommandType.Procedure; 
    //Doing this from memory, but that line should be pretty close 
    cmd.Parameters.AddWithValue("@dateToCheck", dateToCheck); 

    //Continue with call to DB as normal 
} 

Un pas ici, certaines personnes ne précisent le type de « DateTime » sur leur objet SqlParameter, mais je ne l'ai jamais fait cela, et il n'a pas de revenir me mordre, encore. Je crois (encore une fois, en opérant de la mémoire ici) que si vous utilisez un système. [Quel que soit] le type, SqlParameter peut l'assigner automatiquement au type Sql correct. Ainsi, le fait de passer une chaîne peut toujours donner une chaîne, mais le fait de passer un DateTime donnera un DateTime.

Questions connexes