【问题标题】:how to solve 1753 year issue in sqlserver?如何解决sql server 1753年的问题?
【发布时间】:2012-01-18 10:26:51
【问题描述】:

我正在使用 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 的日期。请帮助我。

谢谢!

【问题讨论】:

  • 什么版本的 SQL Server? 2008 年推出支持早年的datetime2
  • 为什么不能阻止用户输入 1753 年之前的日期?对您的用户来说,这可能是一件有用的事情吗?
  • @Damien,感谢您的回复。我们使用的是 2005 版本。
  • 你说这只是一个搜索表单?在这种情况下,不要让他们输入数据中不可能存在的无效日期。

标签: java sql-server


【解决方案1】:

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

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

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 个月)

【讨论】:

    【解决方案2】:

    如果您使用的是 sql server 2005,我认为有 2 个解决方案

    1. 在 varchar 字段中保留日期
    2. 有不同的年、月和日列。

    【讨论】:

      【解决方案3】:

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

      MSDN documentation都推荐!

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          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)
          

          对于一个月中的天数,您可以尝试使用一年中的天数或添加“天”字段。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-23
            • 1970-01-01
            • 1970-01-01
            • 2022-10-25
            • 2015-05-18
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            相关资源
            最近更新 更多