我正在使用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以下的日期。请帮帮我。
谢谢!
答案 0 :(得分:0)
如果你正在使用sql server 2005
,我认为有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)
本月的几天中,您可以尝试使用当年的日期编号或添加“日期”字段。