【问题标题】:Extract last day of the month from MMM(M)YYYY从 MMM(M)YYYY 中提取该月的最后一天
【发布时间】:2022-01-21 10:09:03
【问题描述】:

如何从日期中提取一个月的最后一天

DEC2009、APR2013、AUG2008、NOV2017、JUL2014 等

我已经尝试过 datepart、convert、cast、month、year,但总是遇到类型转换错误。

【问题讨论】:

  • 这些都不是日期;那就是问题所在。日期不是字符串,它们是二进制值,并且具有年、月 组件。您的字符串缺少后者,这可能是您的尝试不起作用的原因。

标签: sql sql-server tsql date-conversion


【解决方案1】:

使用try_converteomonth()

declare @date varchar(7)='jul2014'

select Day(EOMonth(Try_Convert(date, @date)))

【讨论】:

    【解决方案2】:

    您可以尝试以下方法:

    SELECT
        dt,
        DATEADD(day, -1, DATEADD(month, 1,
                             CONVERT(datetime, '01' + dt, 106))) AS dt_eom
    FROM yourTable;
    

    Demo

    这里的策略是首先从例如构建DEC2009 字符串 01DEC2009。然后,我们使用CONVERT,掩码为106。我们通过加一个月然后减一天来获得该月的最后一天。

    【讨论】:

      【解决方案3】:

      你可以用这个

      DECLARE @date VARCHAR(20)='DEC2009'
      
      SELECT Day(CONVERT(NVARCHAR,CAST(DATEADD(MM,DATEDIFF(MM, -1, @date),-1) AS 
      DATE),100))
      

      SELECT
      date,
      Day(CONVERT(NVARCHAR,CAST(DATEADD(MM,DATEDIFF(MM, -1, date),-1) AS 
      DATE),100)) AS date_eom
      FROM Table;
      

      【讨论】:

        【解决方案4】:

        您可以使用EOMONTH 函数获取一个月中的最后一天。

        首先构造一个实际的日期值:将01 添加到开头,然后使用样式106 进行转换。如果您只使用 CONVERTCAST 而不使用样式参数,则可能会因当地文化而遇到问题。相反,您应该明确指定样式。

        SELECT
            dt,
            EOMONTH( CONVERT(date, '01' + dt, 106) ) AS dt_eom
        FROM yourTable;
        

        db<>fiddle

        【讨论】:

          【解决方案5】:

          谢谢大家(除了拉努,他似乎没有理解或回答这个问题)

          您的有用建议,特别是“TRY_CONVERT”让我能够处理两个条目,其中月份是 4 个字符的字段,它们正在抛出它。我的最终代码是:

          EOMONTH(CONVERT(DATE, LEFT(TRIM(myField),3) + RIGHT(TRIM(myField),4)))
          

          而且效果很好。 :)

          快乐的日子!

          【讨论】:

          • 嗨 Shortmeister,你真的应该编辑你的答案并删除关于 Larnu 没有正确回答的提示。 Larnu 的评论是正确且有帮助的,尽管它不是一个完全成熟的解决方案。 SO 不是一个请解决我的问题,而是一个请帮我解决我的问题平台...关于您的一个重要提示:语言-相关日期(如DEC2009)与您系统的文化相关。您的工作代码会在德国机器上中断,这是DEZ2009)。只是为了记住这一点......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-04
          相关资源
          最近更新 更多