如何获取星期六的日期(或任何其他工作日的日期) - SQL Server

问题描述 投票:4回答:7

如何获得星期六的日期。我今天和我约会。

GETDATE()

这该怎么做。

例如。今天是08-08-2011

我希望输出为08-13-2011

sql sql-server sql-server-2008 datetime date
7个回答
4
投票

如果您这样调用它,这个函数将返回下一个星期六:

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

“6”来自你可以为the list of possible values设置的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

[编辑]这可能是另一种解决方案。这应该适用于任何语言:

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
投票
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

希望有所帮助!


3
投票

使用Calendar表(每个日期有一行的表):

SELECT MIN(DateValue) DateValue
FROM Calendar
WHERE DateValue >= CURRENT_TIMESTAMP
AND DayOfWeek = 'Saturday';

2
投票

使用DATEPART获取今天的星期几,并将差异添加到所需的星期几到今天的日期。


1
投票

签出SQL DATEADD函数。

DATEADD (Transact-SQL)

您可以将其与DATEPART函数一起使用以返回正确的日期。

DATEPART (Transact-SQL)


1
投票

试试这个 :

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
投票

另一种方法需要两个步骤,但可能更具可读性(看看ma,无模数):

  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)

或者,如果你对@todayGETDATE()没问题,你可以一次完成所有计算:

SELECT DATEADD(WEEK, 1, DATEADD(DAY, -1 * datepart(weekday, GETDATE()), getdate()))
© www.soinside.com 2019 - 2024. All rights reserved.