تنفيذ الاستعلامات مع DateTime في حيث البند
-
28-09-2019 - |
سؤال
يمكنني استخدام SQL Server 2008 R2 كمخزن بيانات.
حتى الآن على جهاز الاختبار ، كان لدي الإصدار الإنجليزية من البرنامج واستخدمته لجعل الاستعلامات تنسيق حقل DateTime كـ
fromDate.ToString("MM/dd/yyyy");
لقد قمت الآن بنشر قاعدة البيانات على خادم آخر في اللغة الإيطالية. سأقوم بتغيير التنسيق في الكود الخاص بي إلى
fromDate.ToString("dd/MM/yyyy");
هل هناك طريقة لإجراء الاستعلام بتنسيق محايد؟
شكرًا!
تعديل:
لقد نسيت أن أذكر أنني أستخدم nettiers مع codesmith. إليك عينة كاملة
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);
المحلول
ISO 8601 عناصر البيانات وتنسيقات التبادل - تبادل المعلومات - تمثيل التواريخ والأوقات يسمح كل من yyyy-mm-dd و yyyymmdd. يتعرف SQL Server على مواصفات ISO.
على الرغم من أن المعيار يسمح لكل من تنسيقات Yyyy-MM-DD و YyyyMMDD بتمثيلات تاريخ التقويم الكاملة ، إذا تم حذف اليوم [DD] ، فسيتم السماح فقط بتنسيق Yyyy-MM. من خلال عدم السماح بتواريخ النموذج Yyyymm ، يتجنب المعيار الارتباك مع التمثيل المقطوع Yymmdd (لا يزال يستخدم في كثير من الأحيان).
أنا أفضل تنسيق Yyyymmdd ، لكنني أعتقد أن هذا لأنني كنت على دراية بذلك فقط ، وبالنسبة لي يبدو الأمر أكثر عالمية ، بعد التخلص من الشخصيات التي يمكن اعتبارها محددة.
نصائح أخرى
يجب عليك مشاركة الكود الذي تستخدمه لتنفيذ الاستعلام ، لكنني أعتقد أنك تقوم ببناء استعلام SQL ديناميكيًا باستخدام CONSATS لإنشاء الاستعلام والوسائط. يجب عليك استخدام استعلام معلمة ، ثم يمكنك تمرير البيانات ككائن تاريخ ولا حاجة لتحويل سلسلة.
على سبيل المثال ، إذا كان استفسارك قد يكون شيئًا من هذا القبيل
DateTime fromDate = DateTime.Now;
SqlCommand cmd = new SqlCommand(
"select * from Orders where fromDT = @fromDate", con);
cmd.Parameters.AddWithValue("@fromDate", fromDate);
...
كآثار جانبية جيدة ، سيقلل هذا من خطر الإصابة حقن SQL.
تحديث: بعد التحرير الذي يغير سياق السؤال بشكل كبير ، وعلي أن أعترف بأن لدي معرفة صفرية بمشروع .nettiers. ولكن بدافع الفضول هل حاولت فقط تمرير مثيلات التاريخ مباشرة كما في ما يلي؟
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);
شخصيا ، أنا دائما أستخدم yyyy-MM-dd
. هذا أيضا يجعلها قابلة للفرز كسلسلة.
ومع ذلك ، فإن التاريخ هو تاريخ. ليست هناك حاجة لتغيير التاريخ إلى سلسلة. في .NET ، المستخدم DateTime
.