我应该在新SQL表的Date列中使用什么数据类型?

时间:2014-11-28 09:41:04

标签: sql-server date types sqldatatypes

我正在创建一个新的SQL表,它将有一个日期列,它只包含Month和Year(例如: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,或将Month和Year拆分为2列中的Varchar。那么,你会推荐什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果您确定永远不会使用整个日期,那么您应该使用两个单独的字段进行月份和年份,但是您必须将这些值拆分为连接的两侧,否则将无法使用此路径: month name将是varchar / nvarchar列,但year应该是一个整数,因为它始终是一个数字。

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

如果你可以使用持久计算列,你也可以在这些列上有索引,这可能会提高加入时的性能。搜索。

我看到的优势:如果您需要(并且仅使用)“月份”和“年份”信息,将“日期”信息翻译成整个“月份”和“年份”的地方既麻烦又昂贵应用。您可以创建类,辅助方法等,但如果将“干净”信息存储在数据库中,则更容易在所有级别上使用和维护它。