Как преобразовать персидскую (шамси) дату в григорианский в T-SQL? - PullRequest
0 голосов
/ 09 ноября 2019

Я использую много данных, хранящихся в базе данных, чтобы составить отчет, и мне было интересно, существует ли быстрый способ преобразования всех дат в таблицах в персидскую дату при их выборе.

есть несколько способов преобразования, но они не основаны на SQL и поэтому они медленнее, чем функция только в SQL.

, так что если кто-либо знает, какчтобы сделать преобразование в SQL, я ему большое спасибо.

1 Ответ

0 голосов
/ 09 ноября 2019

И в день поиска я решил сделать свой собственный стиль решения.

и результат здесь: Наслаждайтесь: 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
...