PDA

View Full Version : محاسبه روزهای کاری هر نفر در تاریخ خاص



رامین مرادی
پنج شنبه 09 شهریور 1396, 10:02 صبح
وقت بخیر دوستان
من یه جدولی دارم به شکل زیر
146182
من با استفاده از کوئری زیر جمع روزهای کاری هر شخص رو به دست میارم


SELECT [PersonnelId],SUM(convert(int,DateDiff(Day,convert(date,[Date1]),convert(date,[Date2])))+1)as CountDay
FROM [Ensani_MamoriatPersonnelTbl] where [Date1] BETWEEN '2017/01/01' AND '2017/01/30'
group by [PersonnelId]



خروجیم هم درسته. ولی یه چیزی مد نظرم هست نمیدونم شدنیه یا نه.
مثلا تو جدول ردیف 4 رو اگه نگاه کنید چند روز از روز کاریش افتاده تو ماه بعدی .
من میخوام وقتی نوشتم از تاریخ 1 تا 30 ماه ، دیگه تعداد روزهایی که از اون تاریخ گذشته رو حساب نکنه. یعنی فقط تعداد روزی که تو این ماهه رو بهم بده.
در ضمن اگه سمت اس کیو ال امکان پیاده سازیش نیست سمت برنامه سی شارپ چی؟ اونجا امکانش هست؟

Mahmoud.Afrad
پنج شنبه 09 شهریور 1396, 21:46 عصر
اگر از ورژن 2012 به بعد استفاده می کنید از فانکشن EOMONTH میتونید تاریخ آخرین روز ماه از یک تاریخ را بدست بیارید
https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql
در ورژن های قبل هم لینک زیر
https://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/

رامین مرادی
جمعه 10 شهریور 1396, 11:39 صبح
من از 2014 استفاده میکنم. اما اگه امکانش هست برای این مثالم یه کم بیشتر تویح بدید تا اگه بشه پیاده سازیش کنم.

Mahmoud.Afrad
جمعه 10 شهریور 1396, 18:50 عصر
SELECT
[PersonnelId],
SUM(DateDiff(Day , [Date1] , IIF(date2<=EOMONTH([Date1]) , [Date2] , EOMONTH([Date1]))) + 1) as DaysCount
FROM [Ensani_MamoriatPersonnelTbl]
group by [PersonnelId]

رامین مرادی
شنبه 11 شهریور 1396, 09:10 صبح
ممنون خیلی خوب جواب داد . خیلی وقت بود دنبالش بودم.
الان یه مسئله دیگه پیش میاد. اگه بخوام ماه دوم رو حساب کنم چطور باقیمونده از ماه قبل که توی Date2 هست رو به دست بیارم؟

Mahmoud.Afrad
شنبه 11 شهریور 1396, 21:46 عصر
الان سوالی که مطرح میشه این هست که طول مدت میتونه بیشتر از دو ماه هم بشه یا نه؟

رامین مرادی
یک شنبه 12 شهریور 1396, 08:31 صبح
الان سوالی که مطرح میشه این هست که طول مدت میتونه بیشتر از دو ماه هم بشه یا نه؟
امکان داره ولی یکی در صد هزار. که اونم قابل چشم پوشیه.(این مورد رو میشه در نظر نگرفت و بجای ثبت تاریخ برای بیشتر از دوماه اونو به دو یا سه تاریخ کوتاه ثبت کرد)

Mahmoud.Afrad
یک شنبه 12 شهریور 1396, 19:04 عصر
https://stackoverflow.com/a/20271267

programer_it2007
یک شنبه 12 شهریور 1396, 19:20 عصر
از دوستان گرامی و اساتید محترم کسی میتونه راهنمایی کنه که چطوری در محیط vb2008 وقتی عکسی را اسکن می کنم بتونم اسمشو تغییر بدم وهمچنین ادرس ذخیره فایل اسکن شده را تو دیتابیسم بزارم

رامین مرادی
دوشنبه 13 شهریور 1396, 10:57 صبح
https://stackoverflow.com/questions/7218526/split-date-range-into-months
میشه کدها رو توضیح هم بدین تا متوجه بشم و رو پروژه خودم پیاده سازیش کنم

Mahmoud.Afrad
سه شنبه 14 شهریور 1396, 14:25 عصر
کوئری لینک قبلی مشکل داشت، لینک رو اصلاح کردم.

برای جدول شما به صورت زیر جواب میده
;WITH
cte1 AS
(
SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 as num
FROM sys.all_columns
),
cte2 AS
(
SELECT
cte1.num as num,
d.PersonnelId,
d.Date1 as f,
d.date2 as t,
DATEDIFF(MONTH, d.Date1, d.date2) md,
DATEADD(MONTH, cte1.num, DATEADD(DAY, 1-DAY(Date1), Date1)) bp,
DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, cte1.num, DATEADD(DAY, 1-DAY(Date1), Date1)))) ep
FROM cte1
INNER JOIN Ensani_MamoriatPersonnelTbl as d
ON d.date2 >= DATEADD(MONTH, cte1.num-1, d.Date1)
)
, cte3 AS
(
SELECT
PersonnelId,
new_from_date = IIF(num=0 , f , bp), -- CASE num WHEN 0 THEN f ELSE bp END,
new_to_date = IIF(num=md , t , ep)-- CASE num WHEN md THEN t ELSE ep END
FROM cte2
WHERE md >= num
)
select
*,
DATEDIFF(DAY, new_from_date, new_to_date)+1 as KarKard
from cte3
ORDER BY PersonnelId , new_from_date ;

رامین مرادی
چهارشنبه 15 شهریور 1396, 08:41 صبح
دست گلت درد نکنه. یه دنیا ممنون. بدجور کارمو راه انداختی:قلب: