【问题标题】:SQL - Modifying DatesSQL - 修改日期
【发布时间】:2016-11-10 03:12:43
【问题描述】:

在 SQL 中获取日期变量并将其设置为年初和年末的最佳方法是什么?

declare @calcDate date = '7/7/2016'

如何使用 @calcDate 获得“1/1/2016”和“12/31/2016”?

【问题讨论】:

  • 请使用您正在使用的数据库引擎的标签。它甚至建议您在询问时这样做
  • 我不确定我是否理解您的要求。我应该添加哪些其他标签?
  • [sql] 是语言,您可以使用 SQL Server、MySQL、Oracle、Postgresql 等。答案取决于您使用的是哪一种,因此请在您的问题中添加相应的标签
  • 一年的第一天总是1/1,最后一天总是12/31。无需“计算”。
  • 如果有帮助,我目前正在运行 SQL Server 2012

标签: sql sql-server sql-server-2012


【解决方案1】:
DECLARE @calcDate date = '7/7/2016'

SELECT
DATEADD(yy, DATEDIFF(yy,0,@calcDate), 0) AS BeginningOfYear,
DATEADD(yy, DATEDIFF(yy,0,@calcDate) + 1, -1) AS EndOfYear

【讨论】:

  • 这个答案看起来是对的,为什么不予评论而投反对票?
  • @DaveKelly 不是我的反对意见,但这个答案是在没有关于 RDBMS 的标签时发布的,所以 op 可能是错误的。在这种情况下,它不是
【解决方案2】:

我只会使用datefromparts():

select datefromparts(year(@calcdate), 1, 1) as soy,
       datefromparts(year(@calcdate), 12, 31) as eoy

早期版本的 SQL Server 需要奇怪的日期算法。此功能在 SQL Server 2012+ 中可用(请参阅here)。

【讨论】:

  • 我在尝试使用 DateFromParts 时遇到错误。此功能是否需要特定版本的 SQL Service 2012?
  • @inVad3r 您可能在以前版本的数据库上使用 SQL Server management Studio 2012
  • 你是对的。对于造成的混乱,我深表歉意。
【解决方案3】:

在我看来,这里不需要进行真正的“计算”,因为一年的第一天总是 1/1,最后一天总是 12/31。我们只需要将这些附加到相关年份:

declare @calcDate date = '7/7/2016'
select cast(cast(year(@calcDate) as varchar(4)) + '0101' as date)
select cast(cast(year(@calcDate) as varchar(4)) + '1231' as date)

结果:

2016-01-01
2016-12-31

year 在 SQL Server 2008 及更高版本中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多