【问题标题】:Calculate month number,month name, first day of month(date) and last day of month(date) using common table expression in sql server?使用sql server中的公用表表达式计算月份数,月份名称,月份的第一天(日期)和月份的最后一天(日期)?
【发布时间】:2014-09-16 04:48:25
【问题描述】:
declare @start_date as datetime = '12/31/2014'
declare @end_date as datetime = '02/15/2015'

;with cte as (
   select 
       datename(month,@start_date) as [mnth_nm],
       month(@start_date) as [mnth_no],
       @start_date as dat,
       DATEADD(DAY, -1 * DAY(@start_date) + 1, @start_date) as [first_day],
       DATEADD(dd, -DAY(DATEADD(mm, 1, @start_date)), DATEADD(mm, 1, @start_date)) as [last_day]
   union all
   select 
      datename(month, DateAdd(Month, 1, dat)),
      month(dat) + 1 as [mnth_no],
      DateAdd(Month, 1, dat), 
      DATEADD(MONTH, 1, [first_day]), 
      DATEADD(dd, -DAY(DATEADD(mm, 1, dat)), 
      DATEADD(mm, 1, dat)) + 1 
   from 
      cte
   where 
      DateAdd(Month,1,dat) < @end_date
)
select 
    [mnth_nm], [mnth_no], @start_date, [first_day], [last_day] 
from 
    CTE

在上述 CTE 中,所需的输出应根据我的开始和结束日期给出 12 月、1 月和 2 月的输出。

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上以很好地格式化和语法突出显示它!
  • 当然 Marc 感谢您的编辑...
  • 为什么这个标签同时适用于 Oracle 和 SQL Server(以及两个不同版本的 SQL Server)?代码似乎是 T-SQL,所以我猜应该删除 Oracle 标记。

标签: sql sql-server-2008 sql-server-2005


【解决方案1】:

仅更改 where 查询:-

DateAdd(Month,0,dat)

【讨论】:

  • 对于“一月”,它给出的月份数为 13,它应该是 1。一月和二月的最后一天是不正确的。请检查一下。
【解决方案2】:
<b>Got the solution ... </b>
<p>
declare @start_date as datetime = '12/31/2014'
declare @end_date as datetime = '03/15/2015'

;with cte as (
   select 
       datename(month,@start_date) as [mnth_nm],
       month(@start_date) as [mnth_no],
       @start_date as dat,
       DATEADD(DAY, -1 * DAY(@start_date) + 1, @start_date) as [first_day],
       DATEADD(dd, -DAY(DATEADD(mm, 1, @start_date)), DATEADD(mm, 1, @start_date)) as [last_day]
   union All
   select 
      datename(month, DateAdd(Month, 1, dat)),
      month(DateAdd(m,1,dat)) as [mnth_no],
      DateAdd(Month, 1, dat), 
      DATEADD(MONTH, 1, [first_day]), 
DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, DATEADD(MONTH, 1, [first_day])) + 1, 0)) 
   from 
      cte
   where 
    DateAdd(Month,0,dat)<  @end_date
)
select 
    [mnth_nm], [mnth_no], @start_date, [first_day], [last_day] 
from 
    CTE</p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多