محاسبه روزهای بین 2 تاریخ در Sql Server
سلام دوستان
یک سوال داشتم برای نوشتن یک کویری.
فرض کنید کارمندی در یک شرکت از تاریخ
1398/12/25
تا تاریخ
1399/01/05
به مرخصی رفته و این مرخصی در سیستم ثبت شده.
تاریخ شروع مرخصی در فیلد StartDate و تاریخ پایان مرخصی در فیلد EndDate ثبت شده.
حالا من میخوام یک کویری بنویسم که مجموع مرخصی های این کاربر رو در سال 98 نمایش بده
Select * From Leave_Tbl Where StartDate => '1398/01/01' And EndDate <= '1398/12/29'
البته تاریخ ها در دیتابیس به صورت میلادی هستن و برای فهم بهتر مطلب اینجا شمسی نوشتم.
الان در کویری بالا مرخصی کاربر که در بالا بهش اشاره کردم در شرط نمایش داده نمیشه چون تاریخ پایان مرخصی در شرط صحیح نیست و به عبارتی مرخصی کاربر رو 0 محاسبه میکنه در حالی که کاربر در سال 98 مدت 5 روز مرخصی داشته. کویری رو چجوری بنویسم که بشه این مدت مرخصی رو محاسبه کرد؟
پاسخ هوش مصنوعی
برای محاسبه مجموع روزهای مرخصی یک کاربر در سال 98 با توجه به اینکه تاریخ ها به صورت میلادی در دیتابیس ثبت شده اند، می توانید از کویری زیر استفاده کنید. این کویری تاریخ های مرخصی را به صورت کارآمدی فیلتر می کند تا برش های مرخصی را در بر بگیرد.
SELECT
SUM(DATEDIFF(DAY,
CASE
WHEN StartDate < '2019-03-21' THEN '2019-03-21'
ELSE StartDate
END,
CASE
WHEN EndDate > '2019-12-29' THEN '2019-12-29'
ELSE EndDate
END)) AS TotalLeaveDays
FROM
Leave_Tbl
WHERE
StartDate <= '2019-12-29'
AND EndDate >= '2019-03-21'
در این کویری:
- تاریخ شروع مرخصی را بررسی می کنیم و اگر قبل از تاریخ 21 مارس 2019 (معادل آغاز سال 98 شمسی) باشد، از این تاریخ شروع می کنیم.
- تاریخ پایان مرخصی را بررسی می کنیم و اگر بعد از 29 دسامبر 2019 (معادل پایان سال 98 شمسی) باشد، از این تاریخ پایان می زنیم.
- با استفاده از تابع SUM و DATEDIFF، مجموع روزهای مرخصی را محاسبه می کنیم.
سلام
بهتر بود برای این سوال تاریخ ها رو به صورت میلادی می نوشتید چون تمامی عملگرهای sql Server بر روی تاریخ میلادی تعریف شدن. برای محاسبه تعداد روزهای خاص موجود در یک بازه خاص می تونید از این روش استفاده کنید.
select t.*,
Sum(datediff(day,
case when startdate < '2020-02-08' then '2020-02-08' else startdate end),
case when enddate > '2020-02-12' then '2020-02-12' else startdate end)
) + 1) As myColumn
from t;
در کوئری بالا از تابع DateDiff در Sql Server استفاده شده.
حال فرض کنید کارمند شما از تاریخ 2020-02-15 تا تاریخ 2020-02-24 به مرخصی رفته است. و شما میخواید بدونید که بین بازه 2020-02-08 تا 2020-02-12 چه تعداد روز مرخصی داشته است. که به راحتی با اسنفاده از کوئری بالا می تونید این مقدار را محاسبه کنید
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- حذف کامل یک رکورد در جدول ریلیشن شده
- مقایسه ساختار دو دیتابیس در Sql Server
- اشکال در ایجاد کلید خارجی در Sql Server
- تفاوت اوراکل و Sql Server چیست
- جابه جایی سطر و ستون در Sql Server
- استفاده از Stored Procedure در انتیتی فریم ورک code First
- آپدیت لیستی از رکوردها در Sql Server - آپدیت گروهی اطلاعات در Sql Server
- دلیل پرش 1000 تایی خودکار فیلد identity در Sql server
- مشکل نمایش ندادن Data Type موقع تایپ در Sql Server
- کار با تاریخ شمسی وساعت (استفاده از توابع )