【问题标题】:Subtracting One Year减一年
【发布时间】:2014-08-16 02:36:26
【问题描述】:

选择

@begindate = dateadd(mm,-1,CAST(datepart(mm,getdate()) AS VARCHAR(2)) + '/15/' +                  CAST(datepart(YYYY,getdate() -1) AS varchar(4))),

@enddate = CAST(datepart(mm,getdate()) AS VARCHAR(2)) + '/14/' + CAST(datepart(YYYY,getdate() -1) AS varchar(4))

目前,此代码返回 5 月 15 日至 6 月 14 日的日期。这些是我需要的必需日期,但我还需要它在 2013 年,这将返回 2014 年。我试过做一个 dateadd(yyyy, -1) 但它没有工作.所以我想知道是否有人知道我如何才能得到去年的约会。

【问题讨论】:

  • 为什么dateadd(yyyy, -1, xxx) 不起作用?
  • 你想做什么?所有这些拆分、转换和连接(以美国格式,绝对非标准)掩盖了您的要求
  • 根据去年获取上月15日到当月14日的数据
  • 您当前的代码返回两个不能用于日期比较的字符串,除非服务器/数据库/列排序规则正确。如果您在WHERE 语句中使用了这两个变量并且没有得到任何结果,那可能就是原因

标签: sql date dateadd


【解决方案1】:

如果 DateAdd 不起作用,则您的实现中一定有错误。在现有代码之后尝试这样:

SET @begindate = dateadd(year, -1, @begindate);
SET @enddate = dateadd(year, -1, @enddate)

【讨论】:

  • @begindate@enddate 是字符串。进行任何类型的日期运算都会使用服务器的格式(很可能不是美国以外的任何人的美国格式)将它们转换为日期,结果出乎意料
  • 我确实假设变量是日期时间。用户没有指定,尽管他的代码构建了一个字符串,但它是一个可以隐式转换为日期并用于填充日期时间变量的字符串。有很多不同的方法可以达到他想要的结果,但我专注于尝试使用 dateadd() 没有用。
  • 所使用的格式在非美国语言环境中不起作用,因此您不能假设可以进行隐式转换。
【解决方案2】:

声明@begindate 日期时间 声明@enddate 日期时间

设置@begindate = dateadd(mm,-1,CAST(datepart(mm,getdate()) AS VARCHAR(2)) + '/15/' + CAST(datepart(YYYY, getdate()) - 1 AS varchar(4)))

设置 @enddate = CAST(datepart(mm,getdate() ) AS VARCHAR(2)) + '/14/' + CAST(datepart(YYYY, getdate()) - 1 AS varchar(4))

选择@begindate 联合所有 选择@enddate

【讨论】:

  • 我也是这么想的,但是在AS附近说语法不正确,不知道是什么问题
  • 在 SQLServer 上对我来说很好。你在用什么?
【解决方案3】:

您可以使用日期变量和日期算术来代替字符串:

declare @lastyear date=dateadd(yy,-1,cast(getdate() as date))
declare @currentMonth date=dateadd(d,-day(@lastyear),@lastyear)
declare @prevMonth date=dateadd(m,-1,@currentMonth)

select @lastyear,DATEADD(d,14,@currentMonth),DATEADD(d,15,@prevMonth)

在 SQL Server 2012 中更简单,因为您可以使用 DATEFROMPARTS 函数从其部分构造一个新日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多