如何在sqlserver中解决1753年的问题?

时间:2012-01-18 10:26:52

标签: java sql-server

我正在使用sqlserver来存储/搜索。问题是我有一个表格,它开始日期和结束日期进行搜索。如果我在1753年之后输入日期那么没问题。如果我输入任何低于1752的日期,我将得到以下例外:

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. 

我知道sql server支持日期范围b / w 1753和9999.但我无法阻止用户输入1753以下的日期。请帮帮我。

谢谢!

5 个答案:

答案 0 :(得分:0)

如果你正在使用sql server 2005

,我认为有2个解决方案
  1. 在varchar字段中保留日期
  2. 年,月,日有不同的列。

答案 1 :(得分:0)

如果您使用的是SQL Server 2008,则应使用datetime2数据类型。

甚至MSDN documentation推荐它!

答案 2 :(得分:0)

如果您需要在1753年之前在SQL Server 2005中存储日期,那么您将不得不将其存储为文本。

如果您只存储日期(没有时间组件),那么我建议:

CREATE TABLE Tab (
    /* Other Columns */,
    FunnyDate char(8) not null,
    constraint CK_FunnyDate_MostlyValid CHECK (
        FunnyDate like '[0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9]')
    /* Other constraints */
)

哪个应强制它密切组合有效日期(YYYYMMDD格式)。您还可以考虑添加一个计算列,如果它可以转换为这样的值,则将其表示为datetime

如果您需要包含时间组件,我建议您以YYYY-MM-DD"T"hh:mm:ss格式存储它,并再次通过检查约束强制执行。

我上面推荐的格式可以安全地转换为日期时间,而无需考虑区域设置。

如果需要,您还可以编写更严格的检查约束(例如,上述内容确实允许第14个月)

答案 3 :(得分:0)

如何创建SQL CLR用户定义的数据类型?使用.NET我们也可以在1753年之前保存日期。

查看http://weblogs.sqlteam.com/mladenp/archive/2006/12/16/52754.aspx

答案 4 :(得分:0)

根据时间组件的实际格式,您还可以尝试设置日期组件的特定字段:

periodyear CHAR(4)
periodtype CHAR(2)
period CHAR(2)

这样您就可以存储日期的每个部分。 例如,您可以为“March 1745”执行以下操作:

periodyear = '1745'
periodtype = '03' (month periodtype - arbitrary and up to you to define)
period = '03' (for 3rd month)

本月的几天中,您可以尝试使用当年的日期编号或添加“日期”字段。