سلام
نمیدونم هنوز مشکل شما حل شده یا نه. امیدوارم مشکلتون حل شده باشه. اما فکر کردم به جهت کامل کردن تاپیک (برای مراجعات آینده) زدن این پست خالی از لطف نیست.
1. Enterprise Manager را اجرا کنید و از اونجا Databaseتون را باز کنید (مثلاً Northwind)
2. در شاخهی باز شده، زیر شاخهی User Defined Functions را انتخاب کنید. و با Right Click روی اون عبارت New User Defined Functions... رو از منوی باز شده اجرا کنید.
3. عبارات موجود در پنجرهی باز شده رو پا کنید و کد زیر رو در اون وارد کنید:
تابع تبدیل تاریخ میلادی به تاریخ شمسی با فرمت yyyy/mm/dd
--Select dbo.udfComMiladiToShamsi(getdate())
CREATE FUNCTION [dbo].[udfComMiladiToShamsi] (@p_datMiladyDate datetime)
RETURNS varchar(10) AS
BEGIN
Declare @p_strShamsiDate varchar(10),
@intShamsiYear int,
@intShamsiMonth int,
@intShamsiDay int,
@intMiladyYear int,
@intDateDifference int,
@strFirstDayOfYear char(6),
@strMonth char(8),
@strDay char(8)
IF (Year(@p_datMiladyDate) > 1995)
Set @intMiladyYear = 1997 + FLOOR (Abs((Year(@p_datMiladyDate) - 1996)) / 4) * 4
Else
Set @intMiladyYear = 1997
IF (IsDate ('1999/20/12') = 1)
Set @strFirstDayOfYear = '/20/03'
Else
Set @strFirstDayOfYear = '/03/20'
IF @p_datMiladyDate =Convert (DateTime , (LTrim(Str(@intMiladyYear)) + @strFirstDayOfYear))
Begin
Set @intShamsiYear = Year(@p_datMiladyDate) - 1997 + 1375
Set @intShamsiMonth = 12
Set @intShamsiDay = 30
Set @strMonth = LTrim(Str(@intShamsiMonth))
IF (@intShamsiMonth < 10)
Set @strMonth = '0' + @strMonth
Set @strDay = LTrim(Str(@intShamsiDay))
IF (@intShamsiDay < 10)
Set @strDay = '0' + @strDay
/**/
If DATEPART(hh,@p_datMiladyDate)>12
Set @strDay = @strDay - 1
Set @p_strShamsiDate = RTrim (LTrim(Str(@intShamsiYear))) + RTrim (LTrim (@strMonth)) + RTrim (LTrim (@strDay))
Return @p_strShamsiDate
End
IF @p_datMiladyDate >= Convert (DateTime , LTrim(Str(@intMiladyYear - 1)) + @strFirstDayOfYear) And
@p_datMiladyDate < Convert (DateTime , LTrim(Str(@intMiladyYear)) + @strFirstDayOfYear)
Set @p_datMiladyDate = @p_datMiladyDate + 1
Set @intMiladyYear = Year(@p_datMiladyDate)
IF Month(@p_datMiladyDate) <= 2 OR (Month(@p_datMiladyDate) = 3 AND Day(@p_datMiladyDate) < 21)
Set @intMiladyYear = @intMiladyYear - 1
Set @intShamsiYear = @intMiladyYear - 621
Set @intDateDifference = Convert (int , (@p_datMiladyDate - Convert(DateTime , (LTrim(Str(@intMiladyYear)) + @strFirstDayOfYear))))
IF (@intDateDifference < 187)
Begin
Set @intShamsiMonth = FLOOR((@intDateDifference - 1) / 31) + 1
Set @intShamsiDay = @intDateDifference - (@intShamsiMonth - 1) * 31
End Else
Begin
Set @intShamsiMonth = FLOOR((@intDateDifference - 187) / 30) + 7
Set @intShamsiDay = @intDateDifference - (@intShamsiMonth - 7) * 30 - 186
End
Set @strMonth = LTrim(Str(@intShamsiMonth))
IF (@intShamsiMonth < 10)
Set @strMonth = '0' + @strMonth
Set @strDay = LTrim(Str(@intShamsiDay))
IF (@intShamsiDay < 10)
Set @strDay = '0' + @strDay
/**/
If DATEPART(hh,@p_datMiladyDate)>12
Set @strDay = @strDay - 1
Set @p_strShamsiDate = RTrim (LTrim(Str(@intShamsiYear))) + "/"+ RTrim (LTrim (@strMonth)) + "/"+RTrim (LTrim (@strDay))
Return @p_strShamsiDate
END
4. با زدن دکمه OK تابع udfComMiladiToShamsi در Database شما ایجاد میشود.
5. برای به دست آوردن شمارهی روز هفته میتونید از تابع DATEPART به صورت زیر استفاده کنید:
DATEPART(dw,DateValue)
در تابع فوق dw سوئیچ برگرداندن شماره روز هفته میباشد و DateValue تاریخ مورد نظر شماست (یک فیلد، متغیر یا رشته حاوی تاریخ میلادی). این تابع عددی بین 0 تا 6 برای روزهای شنبه تا جمعه برمیگرداند.
6. با اجرای مراحل 1 تا 4 و وارد کردن کد زیر در مرحلهی 3 میتوانید روزهای هفته را به فارسی نمایش دهید:
تابع تبدیل شماره روزهای هفته به نام روزهای هفته
--Select dbo.udfComMiladiToShamsi(getdate())
CREATE FUNCTION [dbo].[udfDayNames] (@p_bytDayNum tinyInt)
RETURNS varchar(8) AS
BEGIN
Declare @p_strDayName varchar(8)
Select @p_strDayName= Case @p_bytDayNum
When 0 Then 'شنبه'
When 1 Then 'یکشنبه'
When 2 Then 'دوشنبه'
When 3 Then 'سه شنبه'
When 4 Then 'چهارشنبه'
When 5 Then 'پنجشنبه'
When 6 Then 'جمعه'
End
Return @p_strDayName
END
جهت تست توابع فوقالذکر میتونید از منوی Tools دستور SQL Query Analyzer رو اجرا کنید و در برنامهی اجرا شده دستور زیر رو وارد کنید و F5 بزنید:
Use Northwind
Select dbo.udfComMiladiToShamsi(OrderDate),
DATEPART(dw,OrderDate),
dbo.udfDayNames(DATEPART(dw,OrderDate)),
DATENAME(dw,OrderDate) From Orders
اما برای اینکه ارتباط تاپیک از تالار VB6 قطع نشه توضیحات زیر رو هم در ادامه باهم ببینیم:
برای استفاده از توابع بالا تو برنامهها (مثلاً برنامههای VB6) کامپوننتهای Microsoft ADO Data Control 6.0 (OLEDB) و Microsoft DataGrid Control 6.0 (OLEDB) رو به پروژه اضافه کنید و از هر کدوم یه دونه روی فرم مورد نظر قرار بدید.
در ADODC1 تنظیمات زیر رو انجام بدید:
در ویژگی ConnectionString عبارت زیر رو وارد کنید:
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=server-name
بجای
server-name نام سرور خودتون رو وارد کنید.
ویژگی CommandType را به adCmdUnknown - 8 تغییر دهید.
در ویژگی RecordSource عبارت زیر را وارد کنید:
select dbo.udfComMiladiToShamsi(OrderDate), OrderDate, DATEPART(dw,OrderDate), dbo.udfDayNames(DATEPART(dw,OrderDate)), DATENAME(dw,OrderDate) from Orders
خاصیت DataSource از DataGrid1 رو هم به Adodc1 تغییر بدید و برنامه رو اجرا کنید.
11.PNG
موفق باشید.