代码之家  ›  专栏  ›  技术社区  ›  Mike Florian Doyen

在SQL数据库中存储没有年份的日期的最佳方法是什么?

  •  11
  • Mike Florian Doyen  · 技术社区  · 15 年前

    12 回复  |  直到 15 年前
        1
  •  17
  •   James    11 年前

    我最近遇到了这个问题,我最初的设计确实存储了日期,而我只是忽略了年份。然而,事实并非如此 Day / Month 而不是列。感觉更干净,可读性更强。

    更新

    然而,在我写这个答案很久之后,事后我举手表示,这些评论被天真地忽略了。通过将日/月存储为单独的字段,有可能存储无效数据,而如果将它们存储为完整的 DateTime

    根据您的验证策略,这可能不是一个问题,但是,如果您依赖DB验证,那么我建议您将其存储为 DATE

        2
  •  7
  •   Todd R    15 年前

    另一个选择(我不认为其他人提供)将存储月份和日期作为单独的int。因此,要查找今天的条目,您可以:

    select quote from quoteTable where month = 4 and day = 20;
    

    这将允许您有特定于日期的消息,而不使用日期(并忽略年份)。

    只是个主意。

        3
  •  3
  •   mamoo    15 年前

    如果在数据库中输入年份不是问题,那么你可以使用闰年来存储日期,在应用程序视图中忽略它。

        4
  •  3
  •   Oded    15 年前

    SmallDateTime 只需忽略年份部分(或将其设置为所有项目的相同值,例如2000年是闰年,因此允许闰年)。

    您仍然可以对正确的数据类型使用适当的日期和时间函数,如果使用VARCHAR字段,您将最终在它之间进行转换。

        5
  •  2
  •   Martin Brown    9 年前

    我不禁觉得,如果日历是由软件工程师发明的,闰日应该是12月32日,而不是2月29日,这样你就可以简单地用1月1日的小整数偏移量。

    您仍然可以使用从3月1日开始的smallint偏移量,3月1日为0,3月2日为1,2月29日为365。但是,它涉及到对所需图形进行某种自定义转换,并且可能无法按您希望的方式进行排序。

    考虑到你可以将一天和一个月存储为两个占用同一空间的小零件,我不确定这是否是一个好的计划,但我想我会完整地提到它。

        6
  •  1
  •   Andrew    15 年前

    既然没有像Oracle那样的间隔类型,那么您就有了几个选择中的一个。

    • 使用datetime时存储年份/ smalldatetime,它将花费 你没有多余的东西来储存它,只是
    • 采用带日期的DW类型方法 表并使用PK/FK链接到它
    • 使用非基于日期的类型,例如 很可能会导致一些困难 使查询保持可搜索性 避免扫描。
        7
  •  1
  •   galford13x    15 年前

    直拨号码怎么样。您可以每次随机选择引号,并在选择时标记另一个布尔字段。您可以在年底重置布尔字段。

        8
  •  0
  •   ChrisNel52    15 年前

    您仍然可以在数据库中使用datetime列,并使用DatePart()SQL函数来检索一年中的某一天。

    SELECT datepart(dy,myDateColumn) FROM myTable
    
        9
  •  0
  •   John M Gant aman_novice    15 年前

    我会避免用约会时间来做这个。从某种意义上说,您将存储不正确的数据。例如,您将2010年4月20日存储为2012年4月20日或您选择的任何年份。尽管年份对您的应用程序并不重要,但这种方法可能会导致一些意想不到的问题。

    举个例子,如果你的约会年份不对呢?你的计算是错误的。

    因为没有本地类型来支持您所做的工作,所以我会将这些值存储为varchar,并在用户定义的函数中进行任何必要的计算。

        10
  •  0
  •   red-X    15 年前

        11
  •  0
  •   VladV    15 年前

    在人类可读格式和一年中的某一天之间进行翻译可能有点痛苦。另一方面,将日期分配给引号并选择它们将非常容易。

    SELECT quote FROM QuoteTable 
    WHERE dayOfYear = DATEPART(dy, GETDATE())
    
        12
  •  -2
  •   Kyll GUISSOUMA Issam    8 年前
    CONVERT(VARCHAR(5),GETDATE(),101)