Как получить дату субботы (или дату любого другого дня недели) - SQL Server - PullRequest
4 голосов
/ 08 августа 2011

Как получить дату субботы. У меня сегодня свидание со мной.

GETDATE()

Как это сделать.

Например. СЕГОДНЯ 08-08-2011

Я хочу выводить как 08-13-2011

Ответы [ 7 ]

4 голосов
/ 08 августа 2011

Это функция, которая вернет следующую субботу, если вы вызовете ее так:

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

«6» происходит из списка возможных значений , которые можно установить для DATEFIRST.

Вы можете получить любой другой день недели, соответствующим образом изменив второй параметр.

Это функция:

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] Это может быть другое решение. Это должно работать на любом языке:

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 @dx=@dx-1
    if @dx < 0 
    BEGIN
      SET @aDate = NULL 
      BREAK
    END
  END

  RETURN @aDate

END
GO
3 голосов
/ 08 августа 2011

Использовать таблицу календаря (таблица с одной строкой на дату):

SELECT MIN(DateValue) DateValue
FROM Calendar
WHERE DateValue >= CURRENT_TIMESTAMP
AND DayOfWeek = 'Saturday';
3 голосов
/ 08 августа 2011
DECLARE @Today date = 'TODAYS-DATE';
DECLARE @TodayNumber int = DATEPART(dw, @Today) -- Get the day number
DECLARE @Saturday date = DATEADD(DAY, (6-@TodayNumber)%7, @Today) 
-- Add the number of days between today and saturday (the 6th day), modulus 7 to stop you adding negative days

Надеюсь, это поможет!

2 голосов
/ 08 августа 2011

Используйте DATEPART , чтобы получить день недели сегодня и добавить разницу от нужного дня недели до текущей даты.

1 голос
/ 10 сентября 2018

Другой подход к этому состоит из двух шагов, но может быть более читабельным (смотри ма, без модуля):

  1. Вернуться к последней субботе: DATEADD(DAY, -1 * datepart(weekday, GETDATE()), getdate())
  2. Тогда,добавить на неделю: DATEADD(WEEK, 1, @lastSaturday, getdate()))

Все это:

declare @today DATETIME = GETDATE()
declare @lastSaturday DATETIME = DATEADD(DAY, -1 * datepart(weekday, @today), @today)
declare @nextSaturday DATETIME = DATEADD(WEEK, 1, @lastSaturday)

Или, если вы в порядке с @today, являющимся GETDATE(), вы можете сделатьРасчет все сразу:

SELECT DATEADD(WEEK, 1, DATEADD(DAY, -1 * datepart(weekday, GETDATE()), getdate()))
1 голос
/ 08 августа 2011

Попробуйте это:

SET DATEFIRST 7
DECLARE @d DATETIME
SET @d = '2011-08-08' --GETDATE()

SELECT NEXT_SAT = DATEADD(day, (7  + @@DATEFIRST - DATEPART(dw, @d)) % 7, @d )
1 голос
/ 08 августа 2011

Извлечь функцию SQL DATEADD.

DATEADD (Transact-SQL)

Что вы можете использовать это вместе с функцией DATEPART для возврата правильной даты.

DATEPART (Transact-SQL)

...