sql >> Database >  >> RDS >> Sqlserver

Hoe de datum van zaterdag (of een andere weekdag) te krijgen - SQL Server

Dit is een functie die de volgende zaterdag terugkomt als je hem zo aanroept:

SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 6)

De "6" komt van de lijst met mogelijke waarden u kunt instellen voor DATEFIRST .

U kunt elke andere dag van de week krijgen door de tweede parameter dienovereenkomstig te wijzigen.

Dit is de functie:

IF OBJECT_ID('dbo.fn_Get_NextWeekDay') IS NOT NULL 
  DROP FUNCTION dbo.fn_Get_NextWeekDay
GO
CREATE FUNCTION dbo.fn_Get_NextWeekDay(
     @aDate   DATETIME
   , @dayofweek      INT
    /*
      @dw - day of the week
      1 - Monday
      2 - Tuesday
      3 - Wednesday
      4 - Thursday
      5 - Friday
      6 - Saturday
      7 - Sunday
    */   
  )
RETURNS DATETIME 
AS
/*
  SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 6)
  SELECT dbo.fn_Get_NextWeekDay('2011-08-08', 1)
*/
BEGIN
  RETURN 
      DATEADD(day
        , ( @dayofweek + 8 - DATEPART(dw, @aDate) - @@DATEFIRST ) % 7
        , @aDate 
      )  
END
GO

[EDIT] Dit is misschien een andere oplossing. Dit zou in elke taal moeten werken:

IF OBJECT_ID('dbo.fn_NextWeekDay') IS NOT NULL 
  DROP FUNCTION dbo.fn_NextWeekDay
GO
CREATE FUNCTION dbo.fn_NextWeekDay(
     @aDate     DATE
   , @dayofweek NVARCHAR(30)
  )
RETURNS DATE
AS
/*
  SELECT dbo.fn_NextWeekDay('2016-12-14', 'fri')
  SELECT dbo.fn_NextWeekDay('2016-03-15', 'mon')
*/
BEGIN
  DECLARE @dx INT = 6
  WHILE UPPER(DATENAME(weekday,@aDate)) NOT LIKE UPPER(@dayofweek) + '%'
  BEGIN

    SET @aDate = DATEADD(day,1,@aDate)

    SET @[email protected]
    if @dx < 0 
    BEGIN
      SET @aDate = NULL 
      BREAK
    END
  END

  RETURN @aDate

END
GO


  1. Wat is een hoogwaardige ontwikkelomgeving voor het schrijven van Oracle SQL?

  2. Loop resultaten PDO PHP

  3. gegevens van de ene tabel naar de andere verplaatsen, postgresql-editie

  4. BESTEL DOOR de IN-waardelijst