PDA

View Full Version : بدست آوردن تعداد روزهای بین دو تاریخ شمسی در SQL



odiseh
سه شنبه 17 بهمن 1385, 09:16 صبح
سلام
من می خوام تعداد روز های بین دو تاریخ شمسی رو که در جدول ذخیره کرده ام رو بدست بیارم. فیلد تاریخ ها از نوع varchar(50) هستش.

چطوری این کارو انجام بدم؟

DonetKarvb
سه شنبه 17 بهمن 1385, 09:36 صبح
سلام
من می خوام تعداد روز های بین دو تاریخ شمسی رو که در جدول ذخیره کرده ام رو بدست بیارم. فیلد تاریخ ها از نوع varchar(50) هستش.

چطوری این کارو انجام بدم؟
متاسفانه باید عرض کنم خدمت شما که عملیات محسباتی برو روی فیلد های کارکتری امکان پذیر نمیابشد. شما باید به نحوی تبدیلش کنی به تاریخ میلادی و بعد کوئری بگیرید.
فکر کنم اینجا خوب در مورد این موضوع بحث شده است
http://barnamenevis.org/forum/showthread.php?t=15465

اَرژنگ
سه شنبه 17 بهمن 1385, 10:06 صبح
سلام
من می خوام تعداد روز های بین دو تاریخ شمسی رو که در جدول ذخیره کرده ام رو بدست بیارم. فیلد تاریخ ها از نوع varchar(50) هستش.

چطوری این کارو انجام بدم؟
بر طبقه اوّلین اصول برنامه نویسی، فیلدهایه تاریخ از نوعه تاریخ DateTime هستند، استفاده از string, varchar, text, ncvarchar.... برایه نگه داشتن تاریخ از همه نظر اشتباه است.

Kamyar.Kimiyabeigi
سه شنبه 17 بهمن 1385, 10:23 صبح
همونطور که DonetKarvb عزیز گفتند اگر فیلد شما از نوع Datetime باشه کار برای شما راحتتر میشه و میتونین از DATEDIFF برای تعیین اختلاف بین دو تاریخ حتی در حد millisecond استفاده کنین

darvishiali
سه شنبه 17 بهمن 1385, 17:26 عصر
CREATE FUNCTION fn_ShamsiDateStrPart (@ADateStr varchar(10), @ADatePart char)
RETURNS int
AS
BEGIN
declare @FY varchar(4), @FM varchar(2), @FD varchar(2),
@SlashPos1 int, @SlashPos2 int
if @ADateStr = '' return null
set @SlashPos1 = CHARINDEX('/', @ADateStr)
if (@SlashPos1 = 0) or ((@SlashPos1 <> 3) and (@SlashPos1 <> 5)) return null
set @SlashPos2 = CHARINDEX('/', @ADateStr, @SlashPos1 + 1)
if @SlashPos2 = 0 return null
set @FY = Cast(SUBSTRING (@ADateStr, 1 , @SlashPos1 - 1 ) as int)
set @FM = Cast(SUBSTRING (@ADateStr, @SlashPos1 + 1, @SlashPos2 - @SlashPos1 - 1) as int)
set @FD = Cast(SUBSTRING (@ADateStr, @SlashPos2 + 1, LEN(@ADateStr) - @SlashPos2) as int)
return
case @ADatePart
when 'Y' then @FY
when 'M' then @FM
when 'D' then @FD
end
END




این تابع یه تاریخ شمسی میگیره و سال یا ماه یا روز اون رو (با توجه به پارامتر) برمیگردونه




CREATE FUNCTION fn_ShamsiDateStrDiffDay (@FDate varchar(10), @LDate varchar(10))
RETURNS int
AS
BEGIN
declare @FY int, @FM int, @FD int, @LY int, @LM int, @LD int,
@FirstM int, @FirstD int, @LastM int, @LastD int,
@YDiff int, @LDiff int, @FDiff int
set @FY = dbo.fn_ShamsiDateStrPart(@FDate, 'Y')
set @FM = dbo.fn_ShamsiDateStrPart(@FDate, 'M')
set @FD = dbo.fn_ShamsiDateStrPart(@FDate, 'D')
set @LastM = 12
set @LastD = 30
set @LDiff = ((@LastM - @FM) * 30) + (@LastD - @FD)
set @LY = dbo.fn_ShamsiDateStrPart(@LDate, 'Y')
set @LM = dbo.fn_ShamsiDateStrPart(@LDate, 'M')
set @LD = dbo.fn_ShamsiDateStrPart(@LDate, 'D')
set @FirstM = 1
set @FirstD = 1
set @FDiff = ((@LM - @FirstM) * 30) + (@LD - @FirstD)+1
set @YDiff = (@LY - (@FY + 1)) * 360;
return @LDiff + @FDiff + @YDiff
END





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

(توجه کن که باید تابع اول ساخته شده باشه تا بتونی تابع دوم رو بسازی!)

موفق باشید