【问题标题】:What data type should I use for my Date column in a new SQL table? [closed]我应该为新 SQL 表中的日期列使用什么数据类型? [关闭]
【发布时间】:2015-01-26 22:36:19
【问题描述】:

我正在创建一个新的 SQL 表,该表将包含一个日期列,其中仅包含月份和年份(例如:2014 年 11 月)。我担心的是我需要在查询中匹配此列才能执行 JOIN。该查询的相关摘录如下所示:

    (
   SELECT 
     ReservationStayID,
     datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar) as [MTH],
     count(*) AS [Nights Spent],
     avg(RateAmount) as [Rate],
     min(CreatedOn) as CreatedOn,
     min(StayDate) as [DateOfArrival],
     max(StayDate) as [DateOfDeparture]
   FROM ReservationStayDate
   GROUP BY ReservationStayID, datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar)
 ) x ON x.ReservationStayID = b.ReservationStayID

我的新表的日期列将与上面查询的第 3 行的输出相匹配(即 datename(m,StayDate.....as [MTH])

我只想把它放在我的新表中,这样我以后在做 JOINS 等时就不会搞砸了。

我读过我可以使用 smalldate,或者将月份和年份拆分为 2 列中的 Varchar。那么,你会推荐什么?

【问题讨论】:

  • 尊敬的管理员,如果您认为这是基于意见的问题,请删除问题。由于我根据实际情况给出了我的 SQL 查询示例,我认为问题与事实有关,因此提供的答案将与这种情况相关。

标签: sql-server date types sqldatatypes


【解决方案1】:

如果您确定永远不会使用整个日期,您应该使用两个单独的字段分别表示月份和年份,但您必须将这些值拆分为连接的两侧,否则这条路径将没有任何优势: month name 将是一个 varchar/nvarchar 列,但 year 应该是一个整数,因为它始终是一个数字。

两个单独列的优点之一是您不必在每次连接时都进行数学运算,因此您必须将这些值分开连接的两侧。
我的意思是,您还必须修改表 ReservationStayDate 的结构,添加月份和年份作为独立值;最简单的解决方案是创建两个calculated columns

如果您可以使用持久计算列,您还可以在这些列上创建索引,这可能会提高连接和搜索时的性能。

我看到的优势:如果您需要(并且只使用)信息“月”和“年”,那么在需要“月”和“年”的任何地方翻译“日期”信息是繁琐且昂贵的应用。您可以创建类、辅助方法等,但如果您将“干净”信息存储在数据库中,则更易于在各个级别使用和维护。

【讨论】:

    【解决方案2】:

    我建议您使用一个日期时间列

    【讨论】:

    • 为什么?有什么理由更喜欢这种数据类型吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2023-03-03
    • 2014-09-28
    相关资源
    最近更新 更多