uitvoering navrae met DATETIME in WHERE klousule
-
28-09-2019 - |
Vra
Ek gebruik SQL Server 2008 R2 as 'n data stoor.
Tot nou toe op die toets masjien het ek die Engelse weergawe van die sagteware en gebruik om navrae opmaak die veld DATETIME as maak
fromDate.ToString("MM/dd/yyyy");
nou het ek die databasis op 'n ander bediener wat is in die Italiaanse taal ontplooi. Ek sal die formaat in my kode verander na
fromDate.ToString("dd/MM/yyyy");
Is daar 'n manier om die navraag te maak in 'n neutrale formaat?
thanks!
wysig :
Ek het vergeet om te noem dat ek met behulp van NetTiers met CodeSmith. Hier is 'n volledige voorbeeld
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);
Oplossing
ISO 8601 Data-elemente en wisselaar formate - Inligting wisselaar - Verteenwoordiging van datums en tye kan beide die YYYY-MM-DD en JJJJMMDD. SQL Server erken die ISO spesifikasies.
Hoewel die standaard kan beide die YYYY-MM-DD en JJJJMMDD formate vir volledige kalender datum vertoë, indien die dag [DD] is weggelaat dan net die YYYY-MM-formaat word toegelaat nie. Deur disallowing datums van die vorm JJJJMM, die standaard vermy verwarring met die afgekapte verteenwoordiging JJMMDD (nog dikwels gebruik).
Ek verkies die JJJJMMDD formaat, maar ek dink dit is omdat ek net geweet het dat om te begin met, en dit lyk vir my meer universele, nadat weg gedoen met karakters wat dalk oorweeg land spesifieke.
Ander wenke
Jy moet die kode wat jy gebruik om die soektog uit te voer te deel, maar ek dink jy is besig om 'n SQL navraag dinamiese gebruik van string concats om die navraag en die argumente te bou. Jy moet eerder gebruik 'n parameters navraag dan kan jy die data as 'n datum voorwerp en nie nodig om converto n string te slaag.
Byvoorbeeld, as jou navraag kon so iets wees
DateTime fromDate = DateTime.Now;
SqlCommand cmd = new SqlCommand(
"select * from Orders where fromDT = @fromDate", con);
cmd.Parameters.AddWithValue("@fromDate", fromDate);
...
As 'n goeie newe-effek, dit sal jou risiko van SQL-inspuiting .
Update: Na jou wysig wat nie verander die vraag konteks aansienlik, en ek moet erken dat ek Zero kennis van die .netTiers projek. Maar net uit nuuskierigheid Het jy al probeer net direk verby die datum gevalle as in die volgende?
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);
Persoonlik, ek gebruik altyd yyyy-MM-dd
. Dit maak dit ook sortable as 'n string.
Maar 'n datum is 'n datum is 'n datum. Daar is geen behoefte om die datum te verander na 'n string. In NET, gebruiker DateTime
.