C# 表示日期的最大值为32

C# 表示日期的最大值为32,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我正在使用SQLServer2005在asp.net中构建应用程序。在我的应用程序中,我必须表示许多日期&日期是尼泊尔语(Bikram sambhat),其中某个月的最大日期可以是32天 那么,在sql server中表示日期的最佳选项是什么,这样就可以将32放在日期值中&在sql server和asp.net中都可以轻松地进行比较(操纵) 我建议使用内置日期类型。听起来,格式中的任何日期都可以轻松转换为标准sql格式 我只想编写一个实用程序,在加载或写入数据库时将sql server中的任何日

我正在使用SQLServer2005在asp.net中构建应用程序。在我的应用程序中,我必须表示许多日期&日期是尼泊尔语(Bikram sambhat),其中某个月的最大日期可以是32天


那么,在sql server中表示日期的最佳选项是什么,这样就可以将32放在日期值中&在sql server和asp.net中都可以轻松地进行比较(操纵)

我建议使用内置日期类型。听起来,格式中的任何日期都可以轻松转换为标准sql格式


我只想编写一个实用程序,在加载或写入数据库时将sql server中的任何日期转换为您的显示格式。

有个家伙实现了一些用于在尼泊尔日期和公历日期之间转换的类。通过这种方式,您可以以尼泊尔文格式输入日期,但可以以SQL Server能够理解的格式存储日期。看这里:


请记住,任一日历中的日期都可以转换为另一个日历-它们指向同一天。

从尼泊尔到公历的转换并不容易。从两个方面考虑:

  • 需要显示尼泊尔日期吗
  • 需要操纵(例如,找出月份、天数等之间的差异)
第一个是易存储为varchar
第二个不是。如果您想知道两个尼泊尔日期之间的差异,可以将日期存储为第二个日期作为公历等效日期,并在它们之间使用datediff/dateadd(day)。但是,dateadd(month)对您来说是无用的,除非您想知道公历日期月份中两个尼泊尔日期的差异,这并不常见

听起来像是在varchar中存储并在前端或作为CLR拥有尼泊尔日期库会更好。
它可能有助于转换有一个完全物化的尼泊尔日期表与相应的公历日期,所以布局将是

NepaliYear   NepaliMonth   NepaliDay  Gregorian
x            4             2          2014-21-23
etc
但我不确定除了转换之外,它对(尼泊尔)日期数学会有多大帮助——而且只有在SQL Server中需要这种转换时才会有帮助

编辑 @pst的评论


有理由选择VARCHAR而不是datetime。我假设大多数活动的频率都是读取/写入尼泊尔日期-存储并读取为VARCHAR-无转换。当且仅当需要日期数学时,它才涉及到库——在这种情况下,您调用转换,并且仅当您在任何时间点需要公历等价物时。如果你想要的只是NepaliDate/scalar或NepaliDate/NepaliDate之间的数学-同样,datetime没有任何好处-它无法处理一个月内的32天

请检查,它可能会有帮助。

日期类型可以支持32/12/2012吗?或者如果大部分时间只是存储和检索,为什么要进行SQL Server日期时间(基于公历)的转换?因为SQL Server是为处理公历日期而不是尼泊尔日期而构建的。使用内置数据类型比侵入自己的类型并丢失所有内置功能要好。我认为没有理由在datetime字段上使用varchar/varbinary/decimal字段,尤其是如果这两个字段都是“通过库处理”的话。这只会使在数据库中处理变得更加困难,并删除验证。(我还希望此响应包含对用户定义的.NET类型的引用)。@pst-请参阅编辑后的答案。这是一个很长的响应,所以我把它包含在了答案中。目前我是这样做的,但是直接用sql server的DateTime类型表示尼泊尔日期(32 in day)字段是无效的,所以我表示为varchar&我无法比较它们directly@ramkumar:我不会将日期存储为varchar。相反,我会将其存储为常规sql日期,并在显示日期时进行转换。当用户输入日期时,必须进行相同的转换。这将允许您使用常规的sql server日期函数进行比较和其他操作,因此可能会简化您的代码。与其提供链接,不如在此处包含答案的基本部分,并提供链接以供其他参考。如果你不能胜任这项工作,你就应该简单地考虑问题而不是发表答案。