【发布时间】:2018-10-20 17:36:08
【问题描述】:
我需要检查给定的一天是否是任何一年的最后一个星期日,如果是,则仅使用 TSQL 返回 1。
我对 TSQL 不太了解。
【问题讨论】:
-
Find last sunday的可能重复
标签: sql sql-server database tsql
我需要检查给定的一天是否是任何一年的最后一个星期日,如果是,则仅使用 TSQL 返回 1。
我对 TSQL 不太了解。
【问题讨论】:
标签: sql sql-server database tsql
SQL Server 在工作日方面存在问题,因为它们可能会受到国际化设置的影响。假设默认值,你可以这样做:
select dateadd(day,
1 - datepart(weekday, datefromparts(@year, 12, 31)),
datefromparts(@year, 12, 31)
)
否则,您需要使用case 表达式将星期几转换为数字。
在旧版本的 SQL Server 中,您可以这样做:
select dateadd(day,
1 - datepart(weekday, cast(@year + '0101' as date)),
cast(@year + '0101' as date)
)
【讨论】:
我没有专门使用 tsql,但如果我的 sql 知识和谷歌搜索足够好,那么这样的事情应该可以解决问题:
... WHERE DATEPART(dw, date) = 7 and DATEDIFF (d, date, DATEFROMPARTS (DATEPART(yyyy, date), 12, 31)) <= 6
基本上,我们首先检查那一天是否是星期日,然后是否距离一年中的最后一天不到一周
【讨论】:
使用 Gordon 先生的查询,如果给定日期是一年中的最后一个星期日,则遵循 IIF() 返回 1,否则返回 0。
使用 2018 作为年份,2018-12-30 作为给定日期。您可以用变量替换值。
select IIF( DATEDIFF(DAY,'2018-12-30',
DATEADD(day,
1 - datepart(weekday, datefromparts(2018, 12, 31)),
datefromparts(2018, 12, 31)
)) = 0, 1, 0)
【讨论】:
你可以使用这个功能
功能代码:
create FUNCTION CheckIsSaturday
(
@date DATETIME
)
RETURNS int
AS
BEGIN
-- Declare the return variable here
DECLARE @result INT
DECLARE @DayOfWeek NVARCHAR(22)
DECLARE @LastDayOfYear DATETIME
select @LastDayOfYear=DATEADD(yy, DATEDIFF(yy, 0, @date) + 1, -1)
SELECT @DayOfWeek=DATENAME(dw, @date)
IF(@DayOfWeek='Saturday' AND DATEDIFF(dd,@date,@LastDayOfYear)<7)
RETURN 1;
RETURN 0;
END
GO
函数用法:
SELECT dbo.CheckIsSaturday('2017-12-23')
【讨论】:
如果您有 Calendar Table,这将变得非常简单
DECLARE @CheckDate DATE = '20181230'
;WITH cteGetDates AS
(
SELECT
[Date], WeekDayName, WeekOfMonth, [MonthName], [Year]
,LastDOWInMonth = ROW_NUMBER() OVER
(
PARTITION BY FirstDayOfMonth, [Weekday]
ORDER BY [Date] DESC
)
FROM
dbo.DateDimension
)
SELECT * FROM cteGetDates D
WHERE D.LastDOWInMonth = 1 AND D.WeekDayName = 'Sunday' and D.MonthName = 'December' AND D.[Date] = @CheckDate
【讨论】:
您也可以使用这个来获取一年中的最后一天:
;WITH getlastdaysofyear ( LastDay, DayCnt ) AS (
SELECT DATEADD(dd, -DAY(DATEADD(mm, 1, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
DATEADD(mm, 1, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1))),
0 AS DayCnt
UNION ALL
SELECT LastDay,
DayCnt + 1
FROM getlastdaysofyear
)
SELECT *
FROM ( SELECT TOP 7 DATEADD(DD, -DayCnt, LastDay) LastDate,
'Last ' + DATENAME(Weekday,DATEADD(DD, -DayCnt, LastDay)) AS DayStatus
FROM getlastdaysofyear ) T
ORDER BY DATEPART(Weekday, LastDate)
希望你喜欢 :)
【讨论】: