تبدو الاستعلام الخاص بك صحيحًا، ولكن الخطأ الذي تواجهه يحدث لأن الاستعلام الفرعي الذي تستخدمه يعيد أكثر من قيمة واحدة. يجب أن يُعيد الاستعلام الفرعي قيمة واحدة فقط ليتمكن الاستعلام الرئيسي من مقارنتها بقيمة 0.
يمكنك حل هذه المشكلة بتعديل الاستعلام الفرعي ليعيد قيمة واحدة. هناك العديد من الطرق لتحقيق ذلك، واحدة منها هي استخدام TOP 1
للحصول على السجل الأول فقط. هذا مثال على كيفية تعديل الاستعلام:
sqlSELECT *
FROM voorwerp
WHERE (
SELECT TOP 1 (((CAST(((DATEADD(dd, looptijd, datum)) - GETDATE()) AS FLOAT) * 24.0) * 60.0) * 60.0) AS tijd
FROM voorwerp
) <= 0
يجب أن يقوم هذا الاستعلام بإعادة السجل الوحيد الذي ينتجه الاستعلام الفرعي والذي تكون قيمة tijd
الخاصة به أقل من أو تساوي 0.
المزيد من المعلومات
يمكننا تحسين الاستعلام بحيث لا يتطلب استخدام استعلام فرعي، بدلاً من ذلك يمكننا استخدام التعبير المباشر في الشرط WHERE. هناك أيضًا بعض التحسينات الأخرى التي يمكن القيام بها لجعل الاستعلام أكثر فعالية. إليك كيف يمكن تعديل الاستعلام لتحقيق ذلك:
sqlSELECT *
FROM voorwerp
WHERE DATEDIFF(SECOND, GETDATE(), DATEADD(DAY, looptijd, datum)) <= 0
في هذا الاستعلام، استخدمنا DATEDIFF
لحساب الفارق بين تاريخ اليوم الحالي GETDATE()
وتاريخ انتهاء الوقت DATEADD(DAY, looptijd, datum)
بالثواني. إذا كان الفارق أقل من أو يساوي صفر، فهذا يعني أن الوقت انتهى أو أنه أقل من الوقت الحالي.