سؤال

أريد أن الحد تقرير إلى العودة من سجلات التاريخ من خلال تاريخ B.هذا هو ما كنت قد تم القيام:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

...التي قيل السجلات التي تم إرجاعها من 12 صباحا 1 يناير إلى 11:59 مساء 31 مارس (أن منتصف الليل هو الافتراضي عند عدم الإشارة إلى وقت).ولكن لاحظت تناقض ، وهو إذا سجل لديها الوقت من 00:00:00 أنه سيكون جزءا من هذه المجموعة.

هل هناك المزيد من الدقيق طريقة للقيام بذلك لذلك سيعود بالضبط تاريخ نطاق أريد ؟ *

حاولت استخدام الوقت:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008 00:00:00'
set @endDate = '04/01/2008 11:59:59'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

...ولكن لاحظت شيئا غريبا:SQL Server الجولة hundreth الثانية بنسبة النصف.لذا علي أن 1 أبريل سجل (ها!كذبة أبريل سجل!grr) إذا كنت تستخدم أي وقت من 11:59:29.لماذا هذا ؟

  • (أنا واثق من هناك.أنا جديدة في هذا.شكرا لمساعدتكم!)
هل كانت مفيدة؟

المحلول

هناك دائمًا الخيار السهل:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date >= @startDate 
and   date < @endDate

نصائح أخرى

أظن أن عمود التاريخ في view_Inspections هو نوع بيانات SmallDateTime.يتمتع نوع البيانات هذا بدقة تبلغ دقيقة واحدة، وهو ما يفسر نتائجك غير المتوقعة (تقريب الثواني إلى أقرب دقيقة).

الطريقة التي يقترحها Roland Shaw هي أفضل طريقة لتعديل استعلامك ليناسب متطلباتك.

يعتبر عامل التشغيل BETWEEN شاملاً، ولهذا السبب ترى النتائج التي تظهر لك في استعلامك الأول.سيعتمد التقريب الذي تراه في استعلامك الثاني على نوع بيانات التاريخ والوقت الدقيق الذي تستخدمه في جدولك.(راجع للشغل، أعتقد أنك تخلط بين الثواني ومئات الثواني).يبدو أنك تستخدم على الأرجح تاريخًا صغيرًا في جدولك، وفي هذه الحالة يتم تقريب الوقت إلى أقرب دقيقة.

إذا كان الجدول الخاص بك يستخدم التاريخ والوقت، فحاول تحويل @startDate و@endDate بشكل صريح إلى قيم DATETIME (CAST(@endDate AS DATETIME)).

ملاحظة سريعة...حتى بالنسبة لقيم DATETIME، يكون SQL Server دقيقًا فقط حتى 3/100 من الثانية، لذلك سيتم تقريب 11:59:59.999 إلى 12:00:00.000.

لديك في الأساس ثلاثة خيارات:

1) بين CAST('01/01/2008 00:00:00.000' AS DATETIME) وCAST ('03/31/2008 12:59:59.997' AS DATETIME)

2) السنة (my_date) = 2008 والشهر (my_date) بين 1 و3

3) my_date >= CAST('01/01/2008 00:00:00.000' AS DATETIME) AND my_date < CAST('04/01/2008 00:00:00.000' AS DATETIME)

الطريقة الأولى ليست بديهية للغاية وعرضة للخطأ في رأيي.الطريقة الثانية تقتل الأداء نظرًا لأنه لا يمكن استخدام الفهارس ويصبح الأمر أكثر تعقيدًا إذا كان بإمكانك إجراء عمليات بحث تمتد لسنوات أو تبدأ/تنتهي في منتصف الأشهر.الطريقة الثالثة، التي اقترحها رولاند، هي الأفضل على ما أعتقد.

ما عليك سوى محاولة إزالة الوقت من حقل التاريخ كما يلي:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

SELECT min(date),max(date) FROM view_Inspections 
WHERE CAST(FLOOR(CAST(date AS FLOAT)) AS DATETIME) BETWEEN CAST(@startDate AS DATETIME) And CAST(@startDate AS DATETIME))

هذا سيعيد كل شيء من 01/01/2008 00:00:00 ل 04/01/2008 11:59:59.999.إذا كنت لا تريد 04/01 متضمنًا، قم بتغيير تاريخ الانتهاء إلى 03/31/2008.

الحل الأفضل هو مجرد إنشاء BIGINT(10) حقل يسمى "جوليان" ، وتخزينها في YYYYMMDD.

ثم القيام الاستعلام حيث جوليان >= '20120103' و جوليان <= '20120203'

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top