【发布时间】:2011-08-08 12:24:39
【问题描述】:
如何获取星期六的日期。我有今天的约会。
GETDATE()
如何做到这一点。
例如。今天是08-08-2011
我想输出为08-13-2011
【问题讨论】:
标签: sql sql-server sql-server-2008 datetime date
如何获取星期六的日期。我有今天的约会。
GETDATE()
如何做到这一点。
例如。今天是08-08-2011
我想输出为08-13-2011
【问题讨论】:
标签: sql sql-server sql-server-2008 datetime date
如果你这样调用,这个函数会在下周六返回:
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
【讨论】:
使用DATEPART 获取今天的星期几,并将所需星期几的差添加到今天的日期。
【讨论】:
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
希望有帮助!
【讨论】:
使用日历表(每个日期一行的表):
SELECT MIN(DateValue) DateValue
FROM Calendar
WHERE DateValue >= CURRENT_TIMESTAMP
AND DayOfWeek = 'Saturday';
【讨论】:
另一种方法需要两个步骤,但可能更具可读性(看起来,没有模数):
DATEADD(DAY, -1 * datepart(weekday, GETDATE()), getdate())
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()))
【讨论】:
【讨论】:
试试这个:
SET DATEFIRST 7
DECLARE @d DATETIME
SET @d = '2011-08-08' --GETDATE()
SELECT NEXT_SAT = DATEADD(day, (7 + @@DATEFIRST - DATEPART(dw, @d)) % 7, @d )
【讨论】:
SET DATEFIRST 7 这不能在 SQL 函数中使用.. 怎么办?