【问题标题】:SQL for current Month and week当前月份和星期的 SQL
【发布时间】:2016-07-11 07:59:32
【问题描述】:

我需要 SQL 来获取yyyyMMdd 格式的当月开始和结束(当月的 1 到当月的 28/30/31)以及一周,但一周应该是从周日到周六

我用了一周的开始日期

SELECT CONVERT(INT, CONVERT(VARCHAR(8), DATEADD(WEEK, DATEDIFF(WEEK, 0,   SYSDATETIME()), 0), 112)

周末结束日期

SELECT CONVERT(INT, CONVERT(VARCHAR(8), DATEADD(WEEK, DATEDIFF(WEEK, 0, SYSDATETIME()) + 1, 0), 112))

月份开始

SELECT CONVERT(INT, CONVERT(VARCHAR(6), SYSDATETIME(), 112) + '01')

月末

SELECT CONVERT(INT, CONVERT(VARCHAR(6), DATEADD(MONTH, 1, SYSDATETIME()), 112) + '01')

但问题是周给我从星期一到星期一的星期日期,而月结束日期给我下个月开始的结束日期 (20160801)

结果应该是

Week from 20160710 to 20160716
Month from 20160701 to 20160731

请帮我改正。

【问题讨论】:

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


    【解决方案1】:

    --一个月的开始日期

    select replace(cast(dateadd(mm,datediff(mm,0,getdate()),0) as date),'-','')
    

    --月末日

    select replace(cast(dateadd(mm,datediff(mm,0,getdate())+1,0)-1 as date),'-','')
    

    -- 在 SQL 2012 及更高版本中

    select replace(eomonth(getdate()),'-','');
    

    --一周的开始日期

    select replace(cast(dateadd(ww,datediff(ww,0,getdate()),0)-1 as date),'-','')
    

    --结束星期几

    select replace(cast(dateadd(ww,datediff(ww,0,getdate())+1,0)-2 as date),'-','')
    

    【讨论】:

      【解决方案2】:

      如何使用DATEPARTDateAddDateDiff 函数:

      SELECT CONVERT(INT, CONVERT(VARCHAR(8),  DateAdd(d, 7 - DatePart(dw, getdate()), getdate()), 112))
      

      当月:

      SELECT CONVERT(INT, CONVERT(VARCHAR(8), DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)), 112))
      

      【讨论】:

        【解决方案3】:

        一周的第一天由DATEFIRST 控制。以下是如何根据当前 DATEFIRST 设置计算一周的第一天,以及当月的第一天和最后一天。

        SET DATEFIRST 7 --Sunday
        -- Start/End of Weeks respecting DATEFIRST
        SELECT 
          DATEADD(DAY,  1-DATEPART(WEEKDAY, GETDATE()), GETDATE()) FirstDayOfCurrentWeek,
          DATEADD(DAY,  7-DATEPART(WEEKDAY, GETDATE()), GETDATE()) LastDayOfCurrentWeek,
          DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0) FirstDayOfMonth,
          DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)) LastDayOfMonth
        

        要将日期转换为 ISO 8601,请使用

        CONVERT(INT, CONVERT( VARCHAR, SomeDate, 112 ))
        

        【讨论】:

        • 我们可以在没有 SET @Today Date = GETDATE() SET DATEFIRST 7 --Sunday 的情况下做到这一点
        • 是的,第一组是复制'n'粘贴单 - 删除它...DATEFIRST 控制一周的第一天,Mon=1,Tues=2 等您可以从 DATEDIFF day zero 就像网上的很多解决方案一样,但这些都是基于 19000101 是星期一的巧合。不同的区域设置在一周的第一天不同。
        • 您能否编辑查询并使其以 INT 格式 yyyyMMdd 且没有任何 SET DATEFIRST 7 等返回?
        猜你喜欢
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多