# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > VB.NET > سوال: کار با تاریخ

## majidsoft

با سلام و خسته نباشید 
من دارم یک برنامه دارم برای کار با مرخصی حالا می خواستم کدی بنویسم که هر ماه یکبار مثلا 2 روز را به ذخیره مرخصی افراداضافه کنه کدی می خواستم که اختلاف بین دو تاریخ را محاسبه کنه و در اول هر ماه اینکار را انجام بده
با تشکر

----------


## fazelm

> با سلام و خسته نباشید 
> من دارم یک برنامه دارم برای کار با مرخصی حالا می خواستم کدی بنویسم که هر ماه یکبار مثلا 2 روز را به ذخیره مرخصی افراداضافه کنه کدی می خواستم که اختلاف بین دو تاریخ را محاسبه کنه و در اول هر ماه اینکار را انجام بده
> با تشکر


تاریخ رو به صورت عدد 8رقمی(13880101) بنویس و از کوچک تری و بزرگتری استفاده کن.

----------


## majid_vb_2008

دوست من مي توني با استفاده از كد زير استفاده كني

        strsql = "Select * From Tabel Where Tarekh BETWEEN '" &Textbox1.Text & "' AND '" & Textbox2.Text & "'"


فقط يادت باشه همونجوري كه دوستمون گفت تاريخ بايد بصورت 8 رقمي ذخيره شده باشه كه براي اونم يك راه بلم اگه خواستي بگو بزارم

----------


## majidsoft

با تشکر از شما دوستان گرامی
باید بگویم که من تاریخ را وارد نمی کنم و خود برنامه هنگام اجرا باید تاریخ را چک کند اگر به اول ماه رسیده باشد یا از اول ماه گذشته باشد(یعنی در اول ماه برنامه اجرا نگردد و چند روز بعد برنامه اجرا شود)خودکار به تمامی افراد در دیتابیس آن مقدار را اضافه کند

----------


## fazelm

> با تشکر از شما دوستان گرامی
> باید بگویم که من تاریخ را وارد نمی کنم و خود برنامه هنگام اجرا باید تاریخ را چک کند اگر به اول ماه رسیده باشد یا از اول ماه گذشته باشد(یعنی در اول ماه برنامه اجرا نگردد و چند روز بعد برنامه اجرا شود)خودکار به تمامی افراد در دیتابیس آن مقدار را اضافه کند


اولا شما باید شماره آخرین ماه و سالتون رو یه جا تو برنامه یادداشت کنید (به صورت 138801 )

شما باید شرطی برای اضافه کردن مرخصی برای برنامه تعریف کنی :

چک کنه این سال و ماه در برنامه قبلا ثبت شده یا نه ؟؟
اگر ثبت شده بود که هیچ
در غیر این صورت :
به تمام افراد مرخصی اضافه کن

متوجه منظورم شدید ؟؟ یا به توضیح بیشتر نیاز دارید ؟؟
در هر صورت در خدمتم

----------


## majidsoft

با سلام ببین دوست عزیز من اصلا کار به سال ندارم می خوام برنامه هنگام اجرا چک کنه اگه اول ماه است به ذخیره مرخصی مثلا 2 روز اضافه کنه

----------


## DoDoklak

من خودم از یه سری توابع استفاده میکنم اینجا میزارم شاید به دردت بخوره

ورودی تمام توابع بصورت yyyy/mm/dd باید باشه و خروجی نیز بای همین فرمت است
این توابع روزهای کبیسه را هم محاسبه میکنند وبا کم وزیاد کردن روز ،ماه و سال رو اصلاح میکنه

تابع اضافه کردن یک روز


PublicFunction ADDDAY(ByVal dat AsString) AsString
Dim y AsString = dat.Substring(0, 4).ToString
Dim m AsString = dat.Substring(5, 2).ToString
Dim d AsString = dat.Substring(8, 2).ToString
Dim ps AsNew Globalization.PersianCalendar
Dim CountDay AsInteger = ps.GetDaysInMonth(y, m, 1)
''''''''''''''''''''''''''''''''''''''''''''''''''  ''
If (1 + CInt(d)) <= CountDay Then
If m.Length <= 1 Then m = "0" + m
d = CStr((CInt(d) + 1))
If d.Length <= 1 Then d = "0" + d
ElseIf (1 + CInt(d)) > CountDay Then
If (CInt(m) + 1) <= 12 Then
m = (CInt(m) + 1)
If m.Length <= 1 Then m = "0" + m
d = "01"
ElseIf (CInt(m) + 1) > 12 Then
m = "01"
d = "01"
y = (CInt(y) + 1)
EndIf
EndIf
''''''''''''''''''''''''''''''''''''''''''''''''''  '''
Return y & "/" & m & "/" & d
EndFunction


تابع کم کردن یک روز


PublicFunction DECDAY(ByVal dat AsString) AsString
Dim y AsString = dat.Substring(0, 4).ToString
Dim m AsString = dat.Substring(5, 2).ToString
Dim d AsString = dat.Substring(8, 2).ToString
Dim ps AsNew Globalization.PersianCalendar
Dim CountDay AsInteger = ps.GetDaysInMonth(y, m, 1)
''''''''''''''''''''''''''''''''''''''''''''''''''  ''
If (CInt(d) - 1) >= 1 Then
If m.Length <= 1 Then m = "0" + m
d = CStr((CInt(d) - 1))
If d.Length <= 1 Then d = "0" + d
ElseIf (CInt(d) - 1) < 1 Then
If (CInt(m) - 1) >= 1 Then
m = (CInt(m) - 1)
If m.Length <= 1 Then m = "0" + m
CountDay = ps.GetDaysInMonth(y, m, 1)
d = CountDay
ElseIf (CInt(m) - 1) < 1 Then
m = "12"
y = (CInt(y) - 1)
CountDay = ps.GetDaysInMonth(y, m, 1)
d = CountDay
EndIf
EndIf
''''''''''''''''''''''''''''''''''''''''''''''''''  '''
Return y & "/" & m & "/" & d
EndFunction


تابع گرفتن تاریخ شمسی سیستم


PublicFunction ShamsiDate() AsString
Dim ps AsNew Globalization.PersianCalendar()
Dim y AsString = ps.GetYear(DateTime.Now)
Dim m AsString = ps.GetMonth(DateTime.Now)
Dim d AsString = ps.GetDayOfMonth(DateTime.Now)
If y.Length <= 1 Then y = "0" + y
If m.Length <= 1 Then m = "0" + m
If d.Length <= 1 Then d = "0" + d
Return y & "/" & m & "/" & d
EndFunction


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


PublicFunction SUBDAY(ByVal dat2 AsString, ByVal dat1 AsString) AsLong
Dim y1 AsString = dat1.Substring(0, 4).ToString
Dim m1 AsString = dat1.Substring(5, 2).ToString
Dim d1 AsString = dat1.Substring(8, 2).ToString
''''''''''''''''''''''''''''''''''''''''''''''''''  '
Dim y2 AsString = dat2.Substring(0, 4).ToString
Dim m2 AsString = dat2.Substring(5, 2).ToString
Dim d2 AsString = dat2.Substring(8, 2).ToString
'''''''''''''''''''''''''''''''''''''''''''''''''
Dim ps AsNew Globalization.PersianCalendar
Dim CountDay1 AsInteger = ps.GetDaysInMonth(y1, m1, 1)
Dim CountDay2 AsInteger = ps.GetDaysInMonth(y2, m2, 1)

If dat2 = dat1 ThenReturn 0
If dat2 > dat1 Then
Dim result AsLong = 0
Dim flag AsBoolean = True
DoWhile flag
If (CInt(d2) - 1) >= 1 Then
If m2.Length <= 1 Then m2 = "0" + m2
d2 = CStr((CInt(d2) - 1))
If d2.Length <= 1 Then d2 = "0" + d2
ElseIf (CInt(d2) - 1) < 1 Then
If (CInt(m2) - 1) >= 1 Then
m2 = (CInt(m2) - 1)
If m2.Length <= 1 Then m2 = "0" + m2
d2 = CountDay2
ElseIf (CInt(m2) - 1) < 1 Then
m2 = "12"
d2 = CountDay2
y2 = (CInt(y2) - 1)
EndIf
EndIf
If (y2 & "/" & m2 & "/" & d2) = dat1 Then
result += 1
flag = False
Else
result += 1
flag = True
EndIf
Loop
Return result
ElseIf dat1 > dat2 Then
Dim result AsLong = 0
Dim flag AsBoolean = True
DoWhile flag
If (CInt(d1) - 1) >= 1 Then
If m1.Length <= 1 Then m1 = "0" + m1
d1 = CStr((CInt(d1) - 1))
If d1.Length <= 1 Then d1 = "0" + d1
ElseIf (CInt(d1) - 1) < 1 Then
If (CInt(m1) - 1) >= 1 Then
m1 = (CInt(m1) - 1)
If m1.Length <= 1 Then m1 = "0" + m1
d1 = CountDay1
ElseIf (CInt(m1) - 1) < 1 Then
m1 = "12"
d1 = CountDay1
y1 = (CInt(y1) - 1)
EndIf
EndIf
If (y1 & "/" & m1 & "/" & d1) = dat2 Then
result -= 1
flag = False
Else
result -= 1
flag = True
EndIf
Loop
Return result
EndIf
EndFunction



اگر برای اضافه کردن ماه و سال هم خواستی بگو همینجا میزارم

----------


## mlf_mlv

من وقت نکردم کد اضافه شدن رو کامل بخونم ولی حواستون باشه اگه تو یه روز دوبار وارد برنامه بشیم دوبار مرخصی اضافه نکنه!!

----------


## majidsoft

با تشکر از توجه همه دوستان ولی سوال من چیز دیگری است من می خواهم برنامه هنگام اجرا چک کند که آیا اول ماه است یا نه و همچنین اگر برنامه دوبار در اول ماه اجرا شد تشخیص بدهد یا حتی اگر در اول ما هاجرا نشد و مثلا در روز سوم از ماه اجرا شد باز چک کند ببیند که آیا برنامه در اول ماه 2 روز را به افراد اضافه کرده است یا خیر

----------

