C# 在.net/sql server中处理bc日期的最佳方法是什么?

C# 在.net/sql server中处理bc日期的最佳方法是什么?,c#,.net,sql,sql-server,C#,.net,Sql,Sql Server,我计划创建一个时间表应用程序,用于存储和显示特定日期的信息。 例如:亚里士多德公元前384-322年;但也有像伊曼纽尔·康德(伊曼纽尔·康德,1724年4月22日至1804年2月12日)这样的日期 我想使用sql compact edition数据库。datetime格式允许从1753年1月1日12:00:00:00 AM到1999年12月31日11:59:59 PM的日期。所以我不能使用原生日期时间格式。 .Net也不允许使用本机DateTime类进行bc日期(0001.01.01是第一天)

我计划创建一个时间表应用程序,用于存储和显示特定日期的信息。 例如:亚里士多德公元前384-322年;但也有像伊曼纽尔·康德(伊曼纽尔·康德,1724年4月22日至1804年2月12日)这样的日期

我想使用sql compact edition数据库。datetime格式允许从1753年1月1日12:00:00:00 AM到1999年12月31日11:59:59 PM的日期。所以我不能使用原生日期时间格式。 .Net也不允许使用本机DateTime类进行bc日期(0001.01.01是第一天)


我必须使用varchar列定义自己的格式并在.Net中解析这些值吗?

您可以看看.Net的Joda time端口,它确实处理历史日期(但您仍然必须自己处理持久性)。

将年份作为带符号整数单独存储。如果您需要该年内的特定日期,请保留一个单独的datetime列,只需为年份部分使用标准值(1900是常见的)。

这里的最佳建议是不要依赖Microsoft的datetime值。更好的解决方案是编写自己的Julian date类,并处理从书面日期(如上面的亚里士多德)到Julian日期的转换

公元前1/1/322=1603447.5
1/1/384 BC=1580801.5

Sub GetJD(mn%, dy%, yr%, ByRef JD#)
    Dim c#
    c# = 12# * (yr% + 4800) + mn% - 3
    JD# = Int(c# / 48) + Int((365 * c# + 2 * (c# - 12 * Int(c# / 12)) + 7) / 12) + dy% - 32083
    If JD# > 2299170! Then JD# = JD# + Int(c# / 4800) - Int(c# / 1200) + 38
    JD# = JD# - 0.5 ' = 0 hrs GMT
End Sub

我打算建议用datetime2和8000-9999年来代替公元前2000年到公元前1年。但我不认为这个数据类型在Sql Compact edition中。你知道1753年的意义吗?这对你的项目意味着什么?它应该是1586年,但enfin。@Henk:你可以检查一下关于1753年限制的问题:我考虑将日期存储在3个单独的列中,因为有时只有特定事件的年份和月份。例如,您可以使用1712-01-01,但这实际上不是正确的数据。当然,您正在丢失Datetime类型的验证部分(例如,该日期是否真的存在)。@fnx使用int可以工作数年,因为一旦您变得非常旧,日历系统就不同了,所有内置的日期验证代码get都被抛出了窗口。该项目看起来很有希望。我希望在接下来的几个月里有一个稳定的版本。我喜欢它支持部分日期,因为有许多历史事件不知道月份或日期。有一张是乔恩·斯基特写的。