【问题标题】:Need to find no of nth occurenece of the day from date in sql需要从sql中的日期开始查找第n次出现的日期
【发布时间】:2013-05-07 12:17:42
【问题描述】:

我有日期和日期。现在我想知道那一天是第 1 周、第 2 周、第 3 周还是第 4 周。

假设我今天过了日期。然后它应该返回该月的“第一个星期二”。

如果我通过了 2013 年 5 月 18 日,那么它应该返回“本月的第三个星期六”。 如果我通过了 2013 年 5 月 31 日,那么它应该返回“每月的第 5 个星期五”。

我怎样才能做到这一点?

【问题讨论】:

  • w.y.t. : 你试过什么?

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


【解决方案1】:
SELECT 
-- Do you need this: (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST % 7)
CASE 1 + (DATEPART(DAY, GETDATE()) - 1) / 7
    WHEN 1 THEN '1St'
    WHEN 2 THEN '2nd'
    WHEN 3 THEN '3rd'
    WHEN 4 THEN '4th'
    ELSE '5th'
END
+ ' '
+ DATENAME(dw, GETDATE())
+ ' of the month'

【讨论】:

    【解决方案2】:

    给你

    DECLARE @date DATETIME;
    
    SET @date = '2013-08-30'
    select 
    case when DATEPART(dd,@date)<=7 then '1st '+datename(DW,@date)
    when DATEPART(dd,@date)>7 and DATEPART(dd,@date)<=14 then '2nd '+datename(DW,@date)
    when DATEPART(dd,@date)>14 and DATEPART(dd,@date)<=21 then '3rd '+datename(DW,@date)
    when DATEPART(dd,@date)>21 and DATEPART(dd,@date)<=28 then '4th '+datename(DW,@date)
    when DATEPART(dd,@date)>28 and DATEPART(dd,@date)<=31 then '5th '+datename(DW,@date) end
    

    【讨论】:

      【解决方案3】:

      试试这个,

      DECLARE @date DATETIME;
      DECLARE @week INT;
      
      SET @date = getdate()
      
      SELECT @week = datepart(wk, @date) - datepart(wk, convert(DATETIME, cast(month(getdate()) AS VARCHAR) + '/01/' + cast(year(getdate()) AS VARCHAR)) + 1)
      
      SELECT CASE WHEN @week = 1 THEN '1st ' WHEN @week = 2 THEN '2nd ' WHEN @week = 3 THEN '3RD ' ELSE '4th ' END + DATENAME(weekday, @date) + ' of the month'
      

      【讨论】:

      • 请检查日期“2013-08-30”的代码。它应该返回每月的第 5 个星期五。而不是返回每月的第 4 个星期五。
      • 您也可以查看 31-May-2013。
      • 简单,只需要多加一个case语句即可。
      【解决方案4】:

      嗯,如果第 XXX 天的编号在 1 到 7 之间,则为该月的第一个 XXX,如果在 8 到 14 之间,则为该月的第二个 XXX,如果在 15 到 21 之间,则为该月的第三个 XXX月份,如果在 22 到 28 之间,则为该月的第 4 个 XXX,如果超过 28,则为该月的第 5 个 XXX...

      【讨论】:

        【解决方案5】:

        更多选择

        DECLARE @date datetime = GETDATE()
        SELECT CASE DATEPART(ww, @date) - (DATEPART(ww, DATEADD(DAY, 1 - DAY(@date), @date)) 
               - CASE WHEN DATEPART(dw, DATEADD(dd, 1 - DAY(@date), @date)) <= DATEPART(dw, @date) THEN 1 ELSE 0 END)
                 WHEN 1 THEN '1st '
                 WHEN 2 THEN '2nd '
                 WHEN 3 THEN '3rd '
                 WHEN 4 THEN '4th '
                 WHEN 5 THEN '5th ' END + DATENAME(dw, @date) + ' of the month' 
        

        SQLFiddle上的演示

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多