السلام عليكم....
نعم عانيت من هذه المشكلة - خاصة مع اختلاف إعدادات التاريخ من جهاز إلى آخر، و لكنني حللتها منذ زمن بعد مراجعة وثائق SQL Server و كيفية تعامله مع التاريخ، ثم كتبت دوال لهذا الغرض بحيث يصل التاريخ إلى SQL Server و يتعامل معه بشكل ثابت بصرف النظر عن إعدادات التاريخ في الجهاز.
ما يهمنا هنا إذا كنت ستتعامل مع قيمة التاريخ فقط في الحقل (دون اعتبار الوقت)، فاكتب الدالة التالية في Module:
كود :
Public Function SQLWhereDate(AField As String, ADate As Date, Optional AOperator As String = "=", Optional ADate2 As Date = #12/31/9999#) As String
If AOperator = "><" Then
' BETWEEN:
SQLWhereDate = "(CONVERT(datetime, CONVERT(nvarchar(10), " & AField & ", 103), 103) BETWEEN " _
& "CONVERT(datetime, '" & Format$(ADate, "dd/mm/yyyy") & "', 103)" _
& " AND CONVERT(datetime, '" & Format$(ADate2, "dd/mm/yyyy") & "', 103))"
Else
' Other operators:
SQLWhereDate = "(CONVERT(datetime, CONVERT(nvarchar(10), " & AField & ", 103), 103) " & AOperator _
& " CONVERT(datetime, '" & Format$(ADate, "dd/mm/yyyy") & "', 103))"
End If
End Function
حيث:
- AField: اسم حقل التاريخ (String).
- ADate: قيمة التاريخ الذي تبحث عنه (Date). و إذا كنت تريد البحث عن نطاق من التواريخ فهذا يمثل تاريخ البداية.
- AOperator: عامل المقارنة (String) و هو اختياري، أي يمكنك إهماله حيث قيمته الافتراضية هي "=". العوامل المسموح بها هي عوامل المقارنة المعروفة بالإضافة إلى الرمزين "><" بهذا الشكل لاستعمال عبارة BETWEEN في جملة SELECT.
- ADate2: تاريخ النهاية (Date) و هو أيضاً اختياري، أي يمكنك إهماله. طبعاً ستحتاج إلى استعماله في حالة استعمال BETWEEN لتحديد تاريخ النهاية.
* مثال:
نفرض أن تاريخ البداية في Text1 و تارخ النهاية في Text2 و نريد البحث عن نطاق بين التاريخين:
كود :
SQLS = "SELECT * FROM TransMaster WHERE " & SQLWhereDate("NoteDate", CDate(Text1.Text), "><", CDate(Text2.Text))
*** النقطة المهمة في الموضوع هي كيفية تحويل الـ VB للـ String إلى Date (سواء كتحويل ضمني أو باستعمال CDate). حيث VB دائماً تأخذ بعين الاعتبار تنسيق التاريخ في النظام Windows حسب الإعدادات الإقليمية في لوحة التحكم. و هذا منطقي لأن عرض و معالجة التاريخ من المفترض أن يخضع لرغبة المستخدم و تفضيلاته حسب البلد الذي هو فيه.
هذا يعني أن ترتيب - أو شكل - التاريخ في مربعات النص (مثلاً اليوم أولاً أو الشهر أولاً) يجب أن يتفق مع إعدادات التاريخ في النظام.
نرجو الاستفادة و السلام.