【问题标题】:How to get date between 2 days name from a table如何从表中获取 2 天名称之间的日期
【发布时间】:2018-06-30 22:59:07
【问题描述】:

我有 2 个日期名称作为输入(例如:“星期五”和“星期一”。我需要从星期五和星期一(星期五、星期六、星期日、星期一)之间的表格中获取所有日期。如果是“星期二”和“星期四”,我需要得到(星期二、星期三和星期四)

我的桌子是

如果日期是星期五和星期一。我的输出应该是

我试过了

      SELECT
           EMPLID, DUR, DayName, TRC
      FROM DayTable
      WHERE         
          DayName BETWEEN 'FRIDAY' AND  'MONDAY'        
      ORDER BY DUR ASC

但不工作,帮我解决这个问题。提前致谢

【问题讨论】:

  • where DUR between "date of friday" and "date of monday"。您只是在进行字符串比较而不是日期比较
  • @Pரதீப் 我不会'得到日期。我将只输入日期名称
  • 你不能这样。而是使用IN('Friday', 'Saturday', 'Sunday', 'Monday')
  • 请在条件的帮助下进行搜索,而不是在条件的帮助下进行搜索
  • 提供DATEPART(weekday, dur) 的解决方案比提供IN('Friday', 'Saturday', 'Sunday', 'Monday' 的解决方案更可取,因为这些解决方案与语言无关(尽管您必须注意下面指出的datefirst 值)。但是,如果您只有日期名称而不是相关日期,则那些生成要比较的日期列表以以您指定的形式给出答案 / 可能会很有用。

标签: sql sql-server-2008


【解决方案1】:

您不能像那样使用 between 运算符。 Datename 返回一个字符串,对于所有在字典上位于“Friday”和“Monday”之间的日期名称,between 运算符为 tru。

我建议使用

 DayName in  ('FRIDAY','SATURDAY','SUNDAY',  'MONDAY'   )

或者使用

set datefirst 2
...
where  datepart(weekday,DUR)>3

【讨论】:

    【解决方案2】:

    如果您在 DUR 上使用 DATEPART 函数,您将获得工作日的整数表示形式。

    所以更新你的 WHERE 子句:

    SELECT
           EMPLID, DUR, DayName, TRC
      FROM DayTable
      WHERE         
          DATEPART(weekday, DUR) BETWEEN 2 AND 6         
      ORDER BY DUR ASC
    

    datepart 将为您提供工作日整数:SUN -> 1, MON-> 2 ... SAT -> 7

    https://docs.microsoft.com/pt-br/sql/t-sql/functions/datepart-transact-sql

    【讨论】:

      【解决方案3】:

      试试这个查询:

      DECLARE @From int,@To int
      
      Create Table #Days(Id int, DayOfWeek Varchar(100))
      Insert into #Days Values
      (1,'Sunday'),
      (2,'Monday'),
      (3,'Tuesday'),
      (4,'Wednesday'),
      (5,'Thursday'),
      (6,'Friday'),
      (7,'Saturday')
      
      Select @From = Id from #Days where DayOfWeek = 'Friday'
      Select @To = Id from #Days where DayOfWeek = 'Monday'
      
      Select T.EMPLID, T.DUR, T.DayName, T.TRC from DayTable T
      Inner Join #Days D on T.DayName = D.DayOfWeek AND (D.Id <= @To Or D.Id >= @From)
      

      希望这会有所帮助!


      更新

      这是表值函数中的相同解决方案:

      create function dbo.DaysBetween (
          @DayFrom nvarchar(16)
          , @DayTo nvarchar(16) 
      ) returns @results table ([DayName] nvarchar(16))
      as
      begin
          declare @daynames table (id smallint not null, [dayname] nvarchar(16) not null)
          insert @daynames(id, [dayname])
          values (0, 'Monday'),(1, 'Tuesday'),(2, 'Wednesday'),(3, 'Thursday'),(4, 'Friday'),(5, 'Saturday'),(6, 'Sunday')
      
          declare @dayFromInt smallint
          , @dayToInt smallint 
      
          select @dayFromInt = id from @daynames where [dayname] = @DayFrom
          if (@dayFromInt is null) 
          begin
              --hacky trick from https://stackoverflow.com/a/4681815/361842
               set @dayFromInt = cast(('Invalid Day From Name: ' + @DayFrom) as int)
               return
          end
          select @dayToInt = id from @daynames where [dayname] = @DayTo
          if (@dayToInt is null) 
          begin
              --hacky trick from https://stackoverflow.com/a/4681815/361842
               set @dayToInt = cast(('Invalid Day To Name: '+ @DayTo) as int)
               return
          end
      
      
          insert @results ([dayname])
          select [dayname]
          from @daynames
          where 
          (
              (@dayFromInt <= @dayToInt) and (id between @dayFromInt and @dayToInt)
              or
              (@dayFromInt > @dayToInt) and (id >= @dayFromInt or id <= @dayToInt)
          )
      
          return 
      end
      go
      

      以下是一些示例场景:

      select * from dbo.DaysBetween('Monday','Friday')
      select * from dbo.DaysBetween('Friday','Monday')
      select * from dbo.DaysBetween('Tuesday','Thursday')
      select * from dbo.DaysBetween('Thursday','Tuesday')
      select * from dbo.DaysBetween('Christmasday','Monday')
      go --required to get this result after the above error
      select * from dbo.DaysBetween('Monday','Holiday')
      

      要在查询中使用它,您可以:

      SELECT EMPLID
      , DUR
      , DayName
      , TRC
      FROM DayTable
      WHERE         
      [DayName] in 
      (
          select [DayName] 
          from dbo.DaysBetween('Friday','Monday')
      )        
      ORDER BY DUR ASC
      

      【讨论】:

        【解决方案4】:

        如果你知道你的 sql server 设置的一周开始日期是Sunday,那么你可以试试这个查询:

          SELECT
               EMPLID, DUR, DayName, TRC
          FROM DayTable
          WHERE         
              DATEPART(WEEKDAY, DUR) <= 2  or DATEPART(WEEKDAY, DUR) >= 6
          ORDER BY DUR ASC
        

        星期一的周索引 = 2 和星期五 = 6

        【讨论】:

          猜你喜欢
          • 2012-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多