我有一個將公曆日期時間轉換爲Jalali日期時間的sql函數。 我有一個表作爲用戶定義的函數在查詢中是耗時的,現在是什麼?
Id StartDate FinishDate AlarmDate
當我EXCUTE一個簡單的查詢,如本
select Id,dbo.Jalali(StartDate) , dbo.Jalali(FinishDate),dbo.Jalali(AlarmDate) from MyTable
此查詢會浪費超過2分鐘我的時間。該表只有2000條記錄。
解決方案是什麼?
功能
create FUNCTION dbo.MiladiToShamsi
(@dd datetime)
RETURNS char(10)
AS
BEGIN
DECLARE @mahs as char(2)
DECLARE @rozs as char(2)
DECLARE @diff As int
DECLARE @i As int
DECLARE @leap As int
DECLARE @roz AS int
DECLARE @mah As int
DECLARE @sal As int
SELECT @roz = 11
SELECT @mah = 10
SELECT @sal = 1358
SELECT @diff = DateDiff("d", cast('1980/01/01' as datetime), @dd) -- leap year
SELECT @i = 1
while @i <= @diff
BEGIN
SELECT @roz = @roz + 1
If @mah = 12 And ((@sal+1) - ((@sal+1)/4)*4) <> 0
If @roz > 29 BEGIN
SELECT @roz = 1
SELECT @mah = @mah + 1
End
If @mah > 12 BEGIN
SELECT @sal = @sal + 1
SELECT @mah = 1
End
If @mah > 6
If @roz > 30 BEGIN
SELECT @roz = 1
SELECT @mah = @mah + 1
End
if @mah <= 6
If @roz > 31 BEGIN
SELECT @roz = 1
SELECT @mah = @mah + 1
End
SELECT @i = @i + 1
END
if @mah < 10
SELECT @mahs = '0' + LTRIM(RTRIM(str(@mah)))
else
SELECT @mahs = LTRIM(RTRIM(str(@mah)))
if @roz < 10
SELECT @rozs = '0' + LTRIM(RTRIM(str(@roz)))
else
SELECT @rozs = LTRIM(RTRIM(str(@roz)))
RETURN LTRIM(RTRIM(str(@sal))) + '/' + LTRIM(RTRIM(@mahs)) + '/' + LTRIM(RTRIM(@rozs))
END
請提供函數定義。 – 2011-04-30 11:53:50
我已經聽說過關於clr的功能。是否有解決方案?他們是否更快? – Saleh 2011-04-30 11:59:18
是的,他們可以更快地進行字符串操作。由於這個函數沒有做任何數據訪問,所以你應該使用'WITH SCHEMABINDING'選項,我也不確定這個函數到底在做什麼,但是看看如何去掉程序代碼 – 2011-04-30 12:06:00