PDA

View Full Version : سوال: اختلاف ساعت و تاریخ میلادی



علی فتحی
دوشنبه 03 اسفند 1394, 14:05 عصر
با سلام تاریخ میلادی ورود و خروج پرسنل در یک ستون ذخیره شده است . حالابا ویو چگونه میتوان یک تاریخ متناظر همان ستون ساخت ولی ساعت بصورت دستی نمایش داده بشه.
مثلا در روبروی تاریخ اول 02/01/2016 07:00 یک سلول بصورت 02/01/2016 ولی ساعت بصورت 08:00 ساخت :یعنی اگر پرسنل ساعت 7 وارد شد تا ساعت 8 یک ساعت اضافه کاری ثبت بشه.



139233

khokhan
دوشنبه 03 اسفند 1394, 15:27 عصر
اگه منظورتون از این کار در جدول داخل دیتابیس هست می شه یه فانکشن تعریف کرد که ورودیش ستول تاریخ جدول باشه و خرو جی اون افزودن یک ساعت به هر رکورد باشه

یه چیزی مثل این :http://sqlhints.com/2014/07/06/how-to-add-hours-minutes-seconds-to-a-datetime-in-sql-server/

مثلا اگه یه ستون تاریخ داشته باشی و بخوای از طریق یه فانکشن 30 روز به تاریخ های موجود در اون فیلد اضافه کنی :
http://www.w3schools.com/sql/func_dateadd.asp

علی فتحی
دوشنبه 03 اسفند 1394, 16:29 عصر
139240
نه قربان میدونید من در جدول اینو میخوام :ساعت شروع کار پرسنل از 7 صبح الی 17 بعداز ظهر است این تاریخها رو خودم برای هر پرسنل ذخیره میکنم.
حالا جدول بالا ساعت ورود و خروج پرسنل است.
اگر کارمندی ساعت 6 صبح اومد براش یک ساعت اضافه کاری حساب بشه
و اگر ساعت 18 رفت براش یک ساعت اضافه کاری حساب بشه
واگر کمتر از ساعتها اومد کسری کار اضافه بشه

من خودم نمونه ساختم ولی دوتا جدول ورود و خروج دارم ولی این برنامه متصفانه هر دورا در یک ستون قرارداده هم ورود هم خروج
این تصویر صحیح است

Mahmoud.Afrad
دوشنبه 03 اسفند 1394, 16:46 عصر
تفاضل ورود و خروج رو حساب کن (کارکرد). میزان معیار رو هم بدست بیار(17-7=10) کافیه کارکرد رو منهای معیار کنی. اگر مثبت بود میشه اضافه کاری اگر منفی بود کسری میشه.

علی فتحی
دوشنبه 03 اسفند 1394, 17:59 عصر
اختلاف تاریخ بصورت عدد صحیح نشون داده میشه .مثلا 16.58 دقیقه میشه

02/01/2016 04:58:00 ب.ظ
02/01/2016
16

محمد آشتیانی
دوشنبه 03 اسفند 1394, 18:02 عصر
تفاضل ورود و خروج رو حساب کن (کارکرد). میزان معیار رو هم بدست بیار(17-7=10) کافیه کارکرد رو منهای معیار کنی. اگر مثبت بود میشه اضافه کاری اگر منفی بود کسری میشه.

این البته ساده ترین مدل محاسبه کارکرده و اشکالم داره (زمانی این روش درسته که صرفا کارکرد بصورت ساعتی مد نظر باشه )، فرض کنید ساعت کاری ۷ الی ۱۷ باشه ، اگر کسی ساعت ۸ ورود داشته باشه و ۱۸ خارج بشه ، میشه ۱۰ ساعت کارکرد ، در صورتی که ۹ ساعت کارکرد موظف داشته ، بعلاوه یک ساعت اضافه کار و یک ساعت کسر کار ، و چون ضرایب اضافه کار و کسر کار تفاوت دارن بنابراین نمیشه این رو ۱۰ ساعت کارکرد عادی محاسبه کرد.



پ ن: این پست ربطی به تاپیک نداشت ، صرفا خواستم توضیح بدم

علی فتحی
دوشنبه 03 اسفند 1394, 18:39 عصر
من براس ساعت هیچ مشکلی ندارم قبل در اکسل طراحی کردم
مشکل این دیتابیس اینه هردو را دریک ستون نوشته اینو چندمین باره تکرار میکنمتفاوت تاریخ ها رو میخوام که دریک ستون هستند.اگردو ستون بو مثل اب خوردن محاسبه میشد که

ژیار رحیمی
دوشنبه 03 اسفند 1394, 18:59 عصر
سلام
با توجه به جدول خروجی شما به ازای هر شخص دو رکورد داری ( رکورد ورود و رکورد خروج) این به نظر من هم افزونگی دارد و هم در خروجی (گرفتن کویری) دچار مشکل میشوی.شما تاریخ ورود و خروج رو به ازای یک رکورد پیاده سازی کنی مشکل شما به راحتی حل میشه.با استفاده از توابع sql server که به ستونهای جدول انتساب میدی به راحتی اختلاف ساعت و اضافه کاری و کم کاری هم بدست میاد.

علی فتحی
دوشنبه 03 اسفند 1394, 19:07 عصر
اقای رحیمی گل ممنون از جوابتون ولی مثل اینکه نخوانده جواب دادی -من که عرض کردم اگر دو فیلد باشه مشکل حل میشه عزیرم .:لبخند::لبخند::لبخند::لبخند:

دیتابیس مال کس دیگه ست که میخوام برنامه براش بنویسم .این برنامه نویس لامسب اومده توی یک رکود ثبت کرده.

ژیار رحیمی
دوشنبه 03 اسفند 1394, 19:27 عصر
اقای رحیمی گل ممنون از جوابتون ولی مثل اینکه نخوانده جواب دادی -من که عرض کردم اگر دو فیلد باشه مشکل حل میشه عزیرم .:لبخند::لبخند::لبخند::لبخند:

دیتابیس مال کس دیگه ست که میخوام برنامه براش بنویسم .این برنامه نویس لامسب اومده توی یک رکود ثبت کرده.
مشکل اینه قبل از اینکه شما پست بالا رو بزارید من مشغول نوشتن بودم مشکل همزمانی در پست بود:قهقهه::قهقهه::قهقهه::قهق ه:

ژیار رحیمی
دوشنبه 03 اسفند 1394, 19:35 عصر
این SCRIPT جدول رو من تست کردم امیدوارم کارتو را بندازه

CREATE TABLE [dbo].[Table_3](
[Id] [int] NOT NULL,
[StartDT] [datetime] NOT NULL,
[EndDT] [datetime] NOT NULL,
[Def] AS (datediff(hour,[StartDt],[EndDT])),
[name] [nchar](10) NULL,
CONSTRAINT [PK_Table_3] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

139242

139243
ستون Def به صورت تابع اختلاف دوستون StartDT و EndDT رو براساس ساعت حساب میکنه پارامتر های دقیقه و روز و سالم داره برای اطلاعات بیشتر به لینک زیر مراجعه شود
https://msdn.microsoft.com/en-us/library/ms189794.aspx

khokhan
سه شنبه 04 اسفند 1394, 13:36 عصر
اقای رحیمی گل ممنون از جوابتون ولی مثل اینکه نخوانده جواب دادی -من که عرض کردم اگر دو فیلد باشه مشکل حل میشه عزیرم .:لبخند::لبخند::لبخند::لبخند:

دیتابیس مال کس دیگه ست که میخوام برنامه براش بنویسم .این برنامه نویس لامسب اومده توی یک رکود ثبت کرده.

این تاریخ ورود و تاریخ خروج که در یک ستون درج شده...... منطق حکم می کنه که یه فیلدی هم باید باشه تا مشخص کنه که کدوم رکورد مال ورود و کدوم رکورد مربوط به خروج

در غیر این صورت سوا کردن ورود و خروج چگونه هست؟؟ :متفکر:

علی فتحی
سه شنبه 04 اسفند 1394, 14:44 عصر
منم نظرم همینه ولی تمام رگودهای جدول کلا مشابه هم هستند .مثلا اگر برای خروج کد 2 و برای ورود کد 1 داشت کار راحت بود ولی تمام ردیفها مشابه غیر از تاریخ ورود و خروج

من فکر میکنم :طرف ایام صبح را ورود و ایام عصر را خروج در نظر گرفته

بلخره همچین برنامه نویسهایی هم پیدا میشن.ههههه دنبال پیچوندن کار هستند


اقای رحیمی فارغ از این سوال جوابت واقعا به درم خورد

علی فتحی
سه شنبه 04 اسفند 1394, 17:04 عصر
در قسمت formulaچگونه تاریخ سیستم رو قراربدم؟

علی فتحی
شنبه 08 اسفند 1394, 17:25 عصر
دوستان به نظر شما طرف چ کار کرده دیتابیس رو که توی گزارشات خودش درست عمل میکنه؟

Mahmoud.Afrad
یک شنبه 09 اسفند 1394, 23:29 عصر
میتونید جدول رو با خودش join کنید البته با شروط مناسب. با این کار میتونید در یک سطر، هم زمان ورود و هم خروج رو داشته باشید. دیگه بقیه محاسبات به راحتی قابل انجام هست.
من جدول با اسکریپت زیر رو ایجاد کردم:

CREATE TABLE [dbo].[Tbl](
[id] [int] IDENTITY(1,1) NOT NULL,
[PersonId] [int] NULL,
[Status] [nvarchar](50) NULL,
[InOutDateTime] [datetime] NULL,
CONSTRAINT [PK_Tbl] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
(Status وضعیت ورود یا خروج رو مشخص میکنه(همون G در مثال شما))
به اینصورت میتونید عمل کنید:

select t1.PersonId,
t1.InOutDateTime as StartDateTime,
t2.InOutDateTime as EndDateTime
from tbl t1
join tbl t2
on t1.PersonId = t2.PersonId
and t1.Status <> t2.Status
and t1.InOutDateTime <= t2.InOutDateTime

آپدیت: کد بالا یک اشکال داره که تمام تاریخها رو ترکیب میکنه و تاریخ های متوالی رو نمیتونه تشخیص بده.

علی فتحی
سه شنبه 11 اسفند 1394, 18:15 عصر
تقریبا به نتیجه رسیدم حالا چگونه زمان و تاریخ رو از هم جدا کنم و در دو فیلد جدا قراربدم با view?


02/01/2016 07:00:00 ق.ظ

علی فتحی
دوشنبه 17 اسفند 1394, 18:24 عصر
برای بدست آوردن ساعت بین دو تاریخ از این کد استفاده کردم
DATEDIFF(dbo.Table2.HH, dbo.Table2.J
) AS float

اختلاف را بصورت رند نشون میده .
چگونه اختلاف را بصورت ساعد وتاریخ نشون بدم ::: 07:22

ژیار رحیمی
سه شنبه 18 اسفند 1394, 03:01 صبح
برای بدست آوردن ساعت بین دو تاریخ از این کد استفاده کردم
DATEDIFF(dbo.Table2.HH, dbo.Table2.J
) AS float

اختلاف را بصورت رند نشون میده .
چگونه اختلاف را بصورت ساعد وتاریخ نشون بدم ::: 07:22

اختلاف رو بر حسب دقیقه mi بگیر نتیجه (بر حسب تعداد دقایق)تقسیم بر 60 ،میشه تعداد ساعت و باقی مانده تقسیم هم میشه تعداد دقیقه به این شیوه بدست میاد

علی فتحی
سه شنبه 18 اسفند 1394, 11:43 صبح
این کارو کردم نشد مثلا اگر جواب 05:55 دقبقه بصورت 5/95 نشون میده

Mahmoud.Afrad
سه شنبه 18 اسفند 1394, 14:48 عصر
میتونید تاریخ ها رو از هم کم کنید و نتیجه رو به نوع TIME کست کنید. (اگر تاریخ ورود و خروج حتما مربوط به یک روز هستند.)
کدی که در پست قبلیم ارسال کردم یک اشکال داشت و اون این بود که همه تاریخ ها رو با هم ترکیب میکرد بدون اینکه در نظر بگیره آیا ورود و خروج متوالی هستند یا نه. اگر ورود و خروج در یک روز حتما ثبت شده باشه باز بهتر میتونید کوئری رو اصلاح کنید. با توجه به جدولی که اسکریپت اونو قبلا قرار دادم به صورت زیر میتونید اختلاف (duration) رو بدست بیارید:

with
ranking as
(
select *,
row_number() over(partition by personId order by personId,InOutDateTime) rnk
from tbl
)
select t1.PersonId,
t1.InOutDateTime as [StartTime],
t2.InOutDateTime as [EndTime],
CAST(t2.InOutDateTime-t1.InOutDateTime as time) as [duration]
from ranking t1
join ranking t2
on t1.PersonId = t2.PersonId
and t1.rnk + 1 = t2.rnk
where t1.Status = N'شروع زمان کار'
and t2.Status = N'پایان زمان کار'

rezashaban
سه شنبه 18 اسفند 1394, 15:12 عصر
منم نظرم همینه ولی تمام رگودهای جدول کلا مشابه هم هستند .مثلا اگر برای خروج کد 2 و برای ورود کد 1 داشت کار راحت بود ولی تمام ردیفها مشابه غیر از تاریخ ورود و خروج

من فکر میکنم :طرف ایام صبح را ورود و ایام عصر را خروج در نظر گرفته

بلخره همچین برنامه نویسهایی هم پیدا میشن.ههههه دنبال پیچوندن کار هستند


اقای رحیمی فارغ از این سوال جوابت واقعا به درم خورد
نه اونی که این دیتابیس رو طراحی کرده میدونسته چیکار میکنه؛
نظرش این بوده که یک کارمند ممکنه در روز بخواد چندین بار بره بیرون از محل کار و بیاد داخل شرکت (مثلا برخی شرکت ها هستن که ساعت نهار رو نماز رو جزء ساعت کاری نمیدونن و یا شخص بخواد بره با موبایل صحبت کنه یا اصلا طرف بخواد بره هوا خوری و ... که ساعت ورود و خروج میزنه و جزو ساعت کاری محاسبه نمیشه)

علی فتحی
سه شنبه 18 اسفند 1394, 18:46 عصر
اینم دیتابیس 2005
http://s7.picofile.com/file/8242317942/New_folder.zip.html

علی فتحی
چهارشنبه 05 آبان 1395, 16:12 عصر
کسی در مورد دیتابیس نظری نداره ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟

ژیار رحیمی
یک شنبه 23 آبان 1395, 12:44 عصر
اینم دیتابیس 2005
http://s7.picofile.com/file/8242317942/New_folder.zip.html

فایلی با این آدرس وجود ندارد.