【问题标题】:Count days of month [duplicate]计算一个月的天数[重复]
【发布时间】:2014-05-08 02:31:28
【问题描述】:

我想知道在 SQL Server 2008 中是否可以计算一个月中的天数...类似于我编写的这段 Javascript 代码:

 function daysInMonth(month, year) {
                    return new Date(year, month, 0).getDate();
                }

                var dateForApp = new Date();
                var MonthForApp = (dateForApp.getMonth() + 1);
                var yearForApp = dateForApp.getFullYear();

                var daysofMonth = new Array();

                for (var i = 1; i <= daysInMonth(MonthForApp, yearForApp); i++) {
                    daysofMonth.push(parseInt(i));
                } // Resulting in something like this (1,2,3,4,5,6,7,8,9,10,11,12...etc)

我现在需要弄清楚如何在 SQL 中执行此操作...到目前为止,我有一个傻瓜:

declare @Date datetime
select @Date = Getdate()

select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(@Date) as varchar)+'-'+cast(month(@Date) as varchar)+'-01' as datetime))))

这会让我知道这个月有多少天 (31),但我现在不太确定如何完成实际计数...我正在尝试 while 循环等,但没有成功.有没有人有任何想法或线索可以指出我? (我在网上搜索时什么也没找到)

【问题讨论】:

  • 如果我错了,请纠正我......但是那个线程告诉我如何获得一个月中有多少天? EG:(31)三月......我知道如何得到这个......我所追求的是,​​现在我有我的 31,我如何构建一个 .. 1,2,3 的数组/结果集, 4,5,6,7,8,9,10,11......31
  • sql中没有数组
  • @Bobby,我知道这一点...但是为了解释这个问题,我需要让您了解我要创建的内容...然后忘记数组...我如何构建一个那么结果集是否包含该信息?
  • 也许可以创建一个临时表并在循环中一次插入你的日子
  • 您的问题不清楚。如果 SQL 中没有数组,那么您想要什么并不明显。你想返回一个包含 X (31) 列的行吗?是否要返回 X (31) 行?而对于这两者,包含什么数据?

标签: sql sql-server


【解决方案1】:

递归 CTE 可以提供天数表;

declare @date datetime = '01 feb 1969'
declare @days int = datediff(day, dateadd(day, 1 - day(@date), @date),
                    dateadd(month, 1, dateadd(day, 1 - day(@date), @date)))

;with days(day) as
(
    select 1 as day
        union all
    select day + 1
        from days
        where day < @days
)
select day from days

【讨论】:

    【解决方案2】:

    您是否尝试过使用DATEDIFF

    【讨论】:

      【解决方案3】:
      DECLARE @DaysInMonth INT
      SET @DaysInMonth = 31
      
      DECLARE @i INT
      SET @i = 1
      
      DECLARE @temp TABLE([Days] INT)
      
      WHILE @i <= @DaysInMonth
      BEGIN
          INSERT INTO @temp
          VALUES(@i)
          SET @i = @i + 1
      END
      
      SELECT *
      FROM @temp
      

      【讨论】:

      • 可能不是最好的方法,但你可以得到你想要的所有日子
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2010-09-18
      • 2012-03-12
      相关资源
      最近更新 更多