l'esecuzione di query con datetime nella clausola WHERE
-
28-09-2019 - |
Domanda
Io uso di SQL Server 2008 R2 come archivio dati.
Fino ad ora sulla macchina di test ho avuto la versione inglese del software e usato per fare le query di formattazione del campo datetime come
fromDate.ToString("MM/dd/yyyy");
ora ho schierato il database su un altro server che è in lingua italiana. Io cambiare il formato nel mio codice per
fromDate.ToString("dd/MM/yyyy");
C'è un modo per rendere la query in un formato neutro?
grazie!
Modifica :
Ho dimenticato di dire che sto usando NetTiers con CodeSmith. Ecco un esempio completo
AppointmentQuery aq = new AppointmentQuery(true, true);
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate.ToString("MM/dd/yyyy"));
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate.ToString("MM/dd/yyyy"));
AppointmentService aSvc = new AppointmentService();
TList<Appointment> appointmentsList = aSvc.Find(aq);
Soluzione
ISO 8601 Elementi di dati e formati di interscambio - Informazioni di interscambio - Rappresentanza di date e orari permette sia la YYYY-MM-DD e YYYYMMDD. SQL Server riconosce le specifiche ISO.
Anche se la norma consente sia al Formati AAAA-MM-DD e AAAAMMGG per completa data di calendario rappresentazioni, se il giorno [GG] è omessa allora solo formato AAAA-MM È permesso. Vietando le date di la forma AAAAMM, i normali evita confusione con il troncato Rappresentazione YYMMDD (ancora spesso utilizzato).
Io preferisco il formato AAAAMMGG, ma penso che sia perché sapevo solo che per cominciare, ed a me sembra più universale, dopo aver fatto fuori con i personaggi che potrebbero essere considerate specifico locale.
Altri suggerimenti
Si dovrebbe condividere il codice che si utilizza per eseguire la query, ma credo che si stanno costruendo una query SQL dinamicamente utilizzando concats stringa per costruire la query e gli argomenti. Si dovrebbe piuttosto utilizzare una query parametrizzata allora si può passare i dati come un oggetto data e non c'è bisogno di converto una stringa.
Per esempio, se la query potrebbe essere qualcosa di simile
DateTime fromDate = DateTime.Now;
SqlCommand cmd = new SqlCommand(
"select * from Orders where fromDT = @fromDate", con);
cmd.Parameters.AddWithValue("@fromDate", fromDate);
...
Come effetto collaterale buona, questo ridurrà il rischio di SQL injection .
Aggiornamento: Dopo la modifica che fa cambiare in modo significativo il contesto domanda, e devo ammettere che ho Zero conoscenza del progetto .netTiers. Ma solo per curiosità hai provato solo di passaggio le istanze di data direttamente come di seguito?
AppointmentQuery aq = new AppointmentQuery(true, true);
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate);
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate);
AppointmentService aSvc = new AppointmentService();
TList<Appointment> appointmentsList = aSvc.Find(aq);
Personalmente, io uso sempre yyyy-MM-dd
. Questo rende anche ordinabile come una stringa.
Tuttavia, una data è una data è una data. Non c'è bisogno di cambiare la data in una stringa. In .NET, DateTime
utente.