PDA

View Full Version : اتفاده صحیح از function



ly.comeng
سه شنبه 07 دی 1389, 16:08 عصر
سلام

طرز صحیح نوشتن دستور زیر چیست؟

use Hot
select * from Receipted where SubscriberID=1 and dbo.ShamsiToMiladi('@Rdate') > 1389-04-30

Rdate فیلد تاریخ در جدول هست

Reza_Yarahmadi
سه شنبه 07 دی 1389, 16:40 عصر
اين چيزي كه نوشتيد تقريبا درسته

select * from Receipted where SubscriberID=1 and dbo.ShamsiToMiladi(Rdate) > '1389-04-30'

AminSobati
سه شنبه 07 دی 1389, 16:43 عصر
سلام دوست عزیزم،
میبایست کوتیشن رو از '@Rdate' حذف کنین و به تاریخی که جلوی علامت < نوشتین اضافه کنین.

ly.comeng
چهارشنبه 08 دی 1389, 07:26 صبح
هر تاریخی که میدم این پیغام رو میده
Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
میدونم یعنی چی،نمیدونم چه کنم؟

hossein_h62
چهارشنبه 08 دی 1389, 07:31 صبح
سلام
فیلد RDate رو از نوع DateTime ایجاد کردین ؟؟

Reza_Yarahmadi
چهارشنبه 08 دی 1389, 07:32 صبح
نوع فيلد Rdate و كد تابع ShamsiToMiladi رو اينجا بذاريد تا بهتر بشه كمكتون كرد.
كد زير هم امتحان كنيد ببينيد درست ميشه يا نه

Select * From Receipted Where SubscriberID = 1 ANDCast(dbo.ShamsiToMiladi(Rdate) as Varchar) as varcha > '1389-04-30'

ly.comeng
چهارشنبه 08 دی 1389, 07:39 صبح
نوع فيلد Rdate و كد تابع ShamsiToMiladi رو اينجا بذاريد تا بهتر بشه كمكتون كرد.
كد زير هم امتحان كنيد ببينيد درست ميشه يا نه

Select * From Receipted Where SubscriberID = 1 ANDCast(dbo.ShamsiToMiladi(Rdate) as Varchar) as varcha > '1389-04-30'

نه! ، نشد.

ly.comeng
چهارشنبه 08 دی 1389, 07:40 صبح
سلام
فیلد RDate رو از نوع DateTime ایجاد کردین ؟؟

بله، DateTime هست

Reza_Yarahmadi
چهارشنبه 08 دی 1389, 07:45 صبح
دوست عزيز فقط كپي / پيست نكنيد به ساختار دستور نگاه كنيد، كدي كه نوشته بودم استباه دستوري داشت!! بايد بصورت زير مينوشتيد

Select * From Receipted Where SubscriberID = 1 AND Cast(dbo.ShamsiToMiladi(Rdate) as Varchar) > '1389-04-30'
در صورت امكان كد تابع ShamsiToMiladi رو اينجا بذاريد شايد مشكل اونجا باشه

ly.comeng
چهارشنبه 08 دی 1389, 07:50 صبح
من دارم یک اشتباه میکنم
باید از dbo.MiladiToShamsi استفاده کنم،نه dbo.ShamsiToMiladi

الان رکورد هارو میاره،اما هر تاریخی میدم همه رو میاره

ly.comeng
چهارشنبه 08 دی 1389, 07:52 صبح
دوست عزيز فقط كپي / پيست نكنيد به ساختار دستور نگاه كنيد، كدي كه نوشته بودم استباه دستوري داشت!! بايد بصورت زير مينوشتيد

Select * From Receipted Where SubscriberID = 1 AND Cast(dbo.ShamsiToMiladi(Rdate) as Varchar) > '1389-04-30'
در صورت امكان كد تابع ShamsiToMiladi رو اينجا بذاريد شايد مشكل اونجا باشه

بله میدونم،اشتباهشو تصحیح کرده بودم
:لبخندساده:

ly.comeng
چهارشنبه 08 دی 1389, 07:54 صبح
تاریخ هم باید اینطور نوشته شود، '1389/04/01'

ly.comeng
چهارشنبه 08 دی 1389, 09:30 صبح
لطفا ادامه بدین،من هنوز به نتیجه نرسیدم

Reza_Yarahmadi
چهارشنبه 08 دی 1389, 09:40 صبح
2 بار گفتم كد تابع مورد استفاده رو اينجا بذاريد ولي شما ....
تا زماني كه كد نباشه چطور ميشه گفت مشكل از كجاست؟

ly.comeng
چهارشنبه 08 دی 1389, 09:42 صبح
USE [Hot]
GO
/****** Object: UserDefinedFunction [dbo].[MiladiTOShamsi] Script Date: 12/13/2010 08:10:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[MiladiTOShamsi] (@MDate DateTime)
RETURNS Varchar(10)
AS
BEGIN
if @MDate is NULL return NULL;
DECLARE @SYear as Integer
DECLARE @SMonth as Integer
DECLARE @SDay as Integer
DECLARE @AllDays as float
DECLARE @ShiftDays as float
DECLARE @OneYear as float
DECLARE @LeftDays as float
DECLARE @YearDay as Integer
DECLARE @Farsi_Date as Varchar(100)
SET @MDate=@MDate-CONVERT(char,@MDate,114)

SET @ShiftDays=466699 +2
SET @OneYear= 365.24199


SET @SYear = 0
SET @SMonth = 0
SET @SDay = 0
SET @AllDays = CAst(@Mdate as Real)

SET @AllDays = @AllDays + @ShiftDays

SET @SYear = (@AllDays / @OneYear) --trunc
SET @LeftDays = @AllDays - @SYear * @OneYear

if (@LeftDays < 0.5)
begin
SET @SYear=@SYear+1
SET @LeftDays = @AllDays - @SYear * @OneYear
end;

SET @YearDay = @LeftDays --trunc
if (@LeftDays - @YearDay) >= 0.5
SET @YearDay=@YearDay+1

if ((@YearDay / 31) > 6 )
begin
SET @SMonth = 6
SET @YearDay=@YearDay-(6 * 31)
SET @SMonth= @SMonth+( @YearDay / 30)
if (@YearDay % 30) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 7) * 30)
end
else
begin
SET @SMonth = @YearDay / 31
if (@YearDay % 31) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 1) * 31)
end
SET @SDay = @YearDay
SET @SYear=@SYear+1

SET @Farsi_Date = CAST (@SYear as VarChar(10)) + '/' + CAST (@SMonth as VarChar(10)) + '/' + CAST (@SDay as VarChar(10))
Return @Farsi_Date



END

hossein_h62
چهارشنبه 08 دی 1389, 10:45 صبح
فانکشن ظاهرا مشکلی نداره.
خروجیش هم varchar پس نیازی به cast نداره!

Select * From Receipted Where SubscriberID = 1 AND dbo.MiladiToShamsi(Rdate) > '1389/04/30'

Reza_Yarahmadi
چهارشنبه 08 دی 1389, 11:36 صبح
تابع تقريبا درسته و فقط كافيه تغيير كوچيكي توي كدش بديد

ALTER FUNCTION [dbo].[MiladiTOShamsi] (@MDate DateTime)
RETURNS Varchar(10)
AS
BEGIN
if @MDate is NULL return NULL;
DECLARE @SYear as Integer
DECLARE @SMonth as Integer
DECLARE @SDay as Integer
DECLARE @AllDays as float
DECLARE @ShiftDays as float
DECLARE @OneYear as float
DECLARE @LeftDays as float
DECLARE @YearDay as Integer
DECLARE @Farsi_Date as Varchar(100)
SET @MDate=@MDate-CONVERT(char,@MDate,114)
SET @ShiftDays=466699 +2
SET @OneYear= 365.24199
SET @SYear = 0
SET @SMonth = 0
SET @SDay = 0
SET @AllDays = CAst(@Mdate as Real)
SET @AllDays = @AllDays + @ShiftDays
SET @SYear = (@AllDays / @OneYear)

SET @LeftDays = @AllDays - @SYear * @OneYear
if (@LeftDays < 0.5)
begin
SET @SYear=@SYear+1
SET @LeftDays = @AllDays - @SYear * @OneYear
end;
SET @YearDay = @LeftDays
if (@LeftDays - @YearDay) >= 0.5
SET @YearDay=@YearDay+1
if ((@YearDay / 31) > 6 )
begin
SET @SMonth = 6
SET @YearDay=@YearDay-(6 * 31)
SET @SMonth= @SMonth+( @YearDay / 30)
if (@YearDay % 30) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 7) * 30)
end
else
begin
SET @SMonth = @YearDay / 31
if (@YearDay % 31) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 1) * 31)
end SET @SDay = @YearDay
SET @SYear=@SYear+1
SET @Farsi_Date = Replace(STR(@SYear, 4), ' ', '0') + '/' +
Replace(STR(@SMonth, 2), ' ', '0') + '/' +
Replace(STR(@SDay, 2), ' ', '0')
Return @Farsi_Date
END
زمان استفاده هم بصورت زير ازش استفاده كنيد

Select * From Receipted Where SubscriberID = 1 AND dbo.ShamsiToMiladi(Rdate) > '1389/04/09'