在 SQL Server 2008 中创建日期

新手上路,请多包涵

SQL Server 2008 中有类似于 DATEFROMPARTS(year, month, day) 的东西吗?我想使用当前的年份和月份创建日期,但我自己的月份日期。这需要在一行中完成,以便在计算列公式中使用。

例如(我不确定它是否有效,因为我没有 SQL Server 2012):

 DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 3)

有没有办法在 SQL Server 2008 中做到这一点?

DATEFROMPARTS 似乎仅在 SQL Server 2012 中可用 (链接)

原文由 Jaiesh_bhai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

使用您示例中的 3 ,您可以这样做:

 dateadd(dd, 3 -1, dateadd(mm, datediff(mm,0, current_timestamp), 0))

它的工作原理是查找自纪元日期以来的月数,将这些月添加回纪元日期,然后将所需的天数添加到先前的结果中。这听起来很复杂,但它建立在 Date (不是 DateTime)类型添加到 Sql Server 2008 之前截断日期的规范方法之上。

您可能会在这里看到其他建议构建日期字符串的答案。我敦促您 避免使用字符串的建议。使用字符串可能会慢 _得多_,并且使用替代日期排序规则/格式存在一些潜在的缺陷。

原文由 Joel Coehoorn 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据 Joel 和 Alejandro 的回答,我建议使用此用户功能

CREATE FUNCTION  MyDATEFROMPARTS
(
    @year int,
    @month int,
    @day int
)
RETURNS datetime
AS
BEGIN

    RETURN  select @d = dateadd(dd,@day-1,dateadd(mm,@month-1, dateadd(yyyy,@year-1900, 0)))

END;

解释技巧:在 SQL Server 中,日期 0 是 1900 年 1 月 1 日,因此第一个 dateadd ( dateadd(yyyy,@year-1900, 0) ) 会导致您想要的一年的第一天,然后添加月份数量: dateadd(mm,@month-1, … 最后,添加天数。

要使用用户函数,请记住添加架构:

 select dbo.MyDATEFROMPARTS(1854,8,3)

您还可以扩展添加小时、分钟和秒的功能:-)

原文由 Marcos Pereda 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进