如何在 T-SQL 中将波斯语 (shamsi) 日期转换为公历?
How to convert Persian (shamsi) date to Gregorian in T-SQL?
我使用存储在数据库中的大量数据来制作报告,我想知道是否有一种 快速 方法可以将表格中的所有日期转换为波斯日期选择他们。
有一些转换方法,但它们 不是 SQL 基于的 ,因此它们比 SQL 中的函数慢。
所以如果有人知道如何在 SQL 中进行转换,我将非常感谢他。
经过一天的搜索,我决定采用自己的解决方式。
结果在这里:享受 :D
USE [Test]
GO
/****** Object: UserDefinedFunction [dbo].[MyG2J] Script Date: 10/11/2019 02:35:43 ب.ظ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[MyG2J](@inputDate DateTime)
RETURNS nvarchar(max)
begin
declare @mDay int,@mMonth int,@mYear int,@sDay int,@sMonth int,@sYear int,@mid int, @isMC bit=0,@isSC bit=0,@preSC bit = 0;
set @mDay=day(@inputDate);
set @mMonth=MONTH(@inputDate);
set @mYear=YEAR(@inputDate);
if @mYear%4=0
set @isMC=1;
else
set @isMC=0;
set @sYear=@mYear-622;
if (@sYear+1)%4=0
set @preSC = 1;
else
set @preSC=0;
select @mid=
case
when @mMonth=1 then'20'
when @mMonth=2 then'19'
when @mMonth=3 then'20'
when @mMonth=4 then'20'
when @mMonth=5 then'21'
when @mMonth=6 then'21'
when @mMonth=7 then'22'
when @mMonth=8 then'22'
when @mMonth=9 then'22'
when @mMonth=10 then'22'
when @mMonth=11 then'21'
when @mMonth=12 then'21'
end
if @isMC=1
begin
set @mid=@mid-1
end
if @mMonth=3 and @mDay=@mid
set @sMonth=@mMonth+9;
else
begin
if (@mMonth=3 and @mDay>@mid) or (@mMonth>3)
begin
set @sYear=@sYear+1;
set @sMonth=@mMonth-3;
end
else
set @sMonth=@mMonth+9;
end
if (@sYear+1)%4=0
set @isSC = 1;
else
set @isSC=0;
if @isMC=1
BEGIN
if @isSC=0
if @mMonth!=3
set @mid=@mid+1
END
else
begin
if @isSC=1
if @mMonth!=3
set @mid=@mid-1
end
if @mDay>@mid
begin
set @sDay=@mDay-@mid;
set @sMonth=@sMonth+1;
end
else
begin
if @sMonth<7
set @sDay=31+(@mDay-@mid);
else
begin
if @sMonth=12
BEGIN
if @isSC=1
set @sDay=30+(@mDay-@mid);
else
set @sDay=29+(@mDay-@mid);
END
else
set @sDay=30+(@mDay-@mid);
end
end
return Cast(@sYear as nvarchar)+'/'+Cast(@sMonth as nvarchar)+'/'+Cast(@sDay as nvarchar)
end
我使用存储在数据库中的大量数据来制作报告,我想知道是否有一种 快速 方法可以将表格中的所有日期转换为波斯日期选择他们。
有一些转换方法,但它们 不是 SQL 基于的 ,因此它们比 SQL 中的函数慢。
所以如果有人知道如何在 SQL 中进行转换,我将非常感谢他。
经过一天的搜索,我决定采用自己的解决方式。
结果在这里:享受 :D
USE [Test]
GO
/****** Object: UserDefinedFunction [dbo].[MyG2J] Script Date: 10/11/2019 02:35:43 ب.ظ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[MyG2J](@inputDate DateTime)
RETURNS nvarchar(max)
begin
declare @mDay int,@mMonth int,@mYear int,@sDay int,@sMonth int,@sYear int,@mid int, @isMC bit=0,@isSC bit=0,@preSC bit = 0;
set @mDay=day(@inputDate);
set @mMonth=MONTH(@inputDate);
set @mYear=YEAR(@inputDate);
if @mYear%4=0
set @isMC=1;
else
set @isMC=0;
set @sYear=@mYear-622;
if (@sYear+1)%4=0
set @preSC = 1;
else
set @preSC=0;
select @mid=
case
when @mMonth=1 then'20'
when @mMonth=2 then'19'
when @mMonth=3 then'20'
when @mMonth=4 then'20'
when @mMonth=5 then'21'
when @mMonth=6 then'21'
when @mMonth=7 then'22'
when @mMonth=8 then'22'
when @mMonth=9 then'22'
when @mMonth=10 then'22'
when @mMonth=11 then'21'
when @mMonth=12 then'21'
end
if @isMC=1
begin
set @mid=@mid-1
end
if @mMonth=3 and @mDay=@mid
set @sMonth=@mMonth+9;
else
begin
if (@mMonth=3 and @mDay>@mid) or (@mMonth>3)
begin
set @sYear=@sYear+1;
set @sMonth=@mMonth-3;
end
else
set @sMonth=@mMonth+9;
end
if (@sYear+1)%4=0
set @isSC = 1;
else
set @isSC=0;
if @isMC=1
BEGIN
if @isSC=0
if @mMonth!=3
set @mid=@mid+1
END
else
begin
if @isSC=1
if @mMonth!=3
set @mid=@mid-1
end
if @mDay>@mid
begin
set @sDay=@mDay-@mid;
set @sMonth=@sMonth+1;
end
else
begin
if @sMonth<7
set @sDay=31+(@mDay-@mid);
else
begin
if @sMonth=12
BEGIN
if @isSC=1
set @sDay=30+(@mDay-@mid);
else
set @sDay=29+(@mDay-@mid);
END
else
set @sDay=30+(@mDay-@mid);
end
end
return Cast(@sYear as nvarchar)+'/'+Cast(@sMonth as nvarchar)+'/'+Cast(@sDay as nvarchar)
end