我有一个将公历日期时间转换为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