2

我住在伊朗,我们在伊朗使用太阳日期而不是公历日期。是否可以将Date数据类型从公历日期更改为太阳日期。另外,我想在我的查询中使用日期函数,例如 DateAdd() 、 DateDiff() 、..。

编辑 :

阳历月份说明:

1-  31 day
2-  31 day
3-  31 day
4-  31 day
5-  31 day
6-  31 day
7-  30 day
8-  30 day
9-  30 day
10- 30 day
11- 30 day
12- 29 day (in Leap year 30 day)
SUM-365 day in each year

太阳日期的开始是每个公历日期的 23-3-...。

编辑 1

我在 SQL Server 中使用以下函数将公历日期转换为太阳日期:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[PersianDate]
(@MiladiDate DATE)
returns varchar(10)
AS
BEGIN
    Declare @days int
    Declare @year int
    set @year=Year(@MiladiDate) 
    Declare @month int  
    Set @days=DATEDIFF ( day ,  Convert(Date,cast(Year(@MiladiDate) as varchar)+'/1/1'), @MiladiDate)+1
    if @days>79  --یعنی یک فروردین ماه
    begin
        set @days=@days-79
        if @days<=186
        begin
            set @month=@days/31;
            if (@days%31=0)
                set @days=31
            else
            begin
                set @month=@month+1
                set @days=@days%31
            end
        end
        else
        begin
            set @days=@days-186
            set @month=6+@days/30;
            if (@days%30=0)
                set @days=30
            else
            begin
                set @month=@month+1
                set @days=@days%30
            end
        end
        set @year=@Year-621
    end
    else
    begin
        set @year=@year-1   
        if (((@Year % 100)<> 0 and (@Year % 4) = 0) or ((@Year % 100)= 0 and (@Year % 400) = 0))
            set @days=@days+11
        else
            set @days=@days+10
        set @month=@days/30+9
        if (@days%30=0)
            set @days=30
        else
        begin
            set @month=@month+1
            set @days=@days%30
        end
        set @year=@year-621
    end
    RETURN cast (@year as varchar)+'/'+ 
                                    case
                                    when @month<10 then '0'
                                    else ''
                                    END
                                    + cast (@month as varchar)+'/'+
                                    case 
                                    when @days<10 then '0'
                                    else ''
                                    END
                                    + cast (@days as varchar)
END

编辑 2

要将太阳日期转换为公历日期,可以使用 CLR 函数:

创建 CLR 函数

4

4 回答 4

1

我建议您构建一个日历表,其中包含公历日期和阳历日期作为两列(以及其他列,例如星期几、月份编号、年份、月份名称)。您应该能够在 Excel 中轻松构建这样的表格,然后将其导入表格。

然后,您可以采用两种方法之一。第一种是将所有日期存储为公历日期,然后查找日期值以在输入和输出上进行转换。如果您想为日期使用大量内置功能,您可以这样做。

第二种方法是将日期存储为代表太阳日期的字符串。然后,当您想要进行内置操作时,可以使用该表转换为公历日期。但是,您可能会发现仅使用日历表就无需使用大多数内置功能。

于 2012-06-08T12:26:25.210 回答
0

您需要使用 sp_configure 设置服务器的默认日期格式。 http://support.microsoft.com/kb/173907

于 2012-06-08T12:07:09.117 回答
0

您不能将日期数据类型日历从公历更改为太阳能。

于 2012-06-08T12:41:06.130 回答
0

我找到了我的问题的答案。我必须在 sql server 中使用公历日期数据类型并将我的应用程序中的日期列转换为太阳日期。我的应用程序使用 C# 编写,下面的链接有助于将数据从公历日期转换为太阳日期。 以太阳日期格式显示 gregoriandate

谢谢大家。

于 2012-06-08T12:58:15.783 回答