【问题标题】:How can I get the last day of the previous month from a date entered?如何从输入的日期获取上个月的最后一天?
【发布时间】:2015-06-11 00:48:40
【问题描述】:

我正在写一个存储过程,这个存储过程需要输入一个日期:

DECLARE @dateCurrent AS DATE = '10/31/2014' // 让我们声明 '10/31/2014' 是用户输入。

根据输入的日期,我想将以下变量设置为:

DECLARE @datePrior AS DATE = PreviousMonth(@dateCurrent) 

Where PreviousMonthLastDayOfPreviousMonth(@dateCurrent) == '9/30/2014'

因此,如果用户输入“2014 年 10 月 31 日”,则应将以下变量设置为“2014 年 9 月 30 日”,这实际上是自输入日期起上个月的最后一天。

感谢您的帮助!

【问题讨论】:

  • 到目前为止你尝试过什么代码?
  • 仅供参考,如果您在上面运行 SQL Server 2012,请选择 EOMONTH(@dateCurrent,-1)
  • @ganders 我试过 EOMONTH() 但发现它是 2012 年的服务器函数而不是 2008 年的 r2

标签: sql-server tsql stored-procedures sql-server-2008-r2


【解决方案1】:

一种常见的方法是当月的第一天减去 1 天:

SELECT DATEADD(DAY,-1,CONVERT(VARCHAR(6),@dateCurrent,112)+'01')

【讨论】:

  • 但这会给我 2014 年 9 月 30 日吗?包括月份和年份?我只是问,因为您建议中 dateadd 的参数之一是“Day”
  • 你为什么不试试呢?,这会返回一个日期时间,如果你想要一个特定的格式,那么你可以将它转换为字符串或日期或任何你想要的
【解决方案2】:

另一种方法是:

DECLARE @date datetime = GETDATE()
SELECT DATEADD(DAY, -(DAY(@date)), @date)

这将从今天减去当月过去的天数,并返回上个月最后一天的日期。

【讨论】:

    【解决方案3】:
    declare @dateCurrent date =  '9/30/2014'
    
    select DATEADD(MONTH, DATEDIFF(MONTH, -1, @dateCurrent)-1, -1)
    

    【讨论】:

      【解决方案4】:

      您想先将字符串转换为日期。然后您可以使用 datediff 计算现在与输入日期当月开始之间的差异。将该差异添加到输入日期,您就有了上个月的月底。比如……

      SELECT DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, CAST('10/31/2014' as datetime)),0))
      

      【讨论】:

      • 变量被定义为DATE,而不是字符串
      【解决方案5】:

      与 Lamak 的答案相同,但日期已格式化

        select dateadd(day,-1,DATEADD(MM, DATEDIFF(MM,0,GETDATE()),0))
      

      【讨论】:

        猜你喜欢
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 2010-12-13
        相关资源
        最近更新 更多