我有一个查询,其中我获得了日期的 WeekDay ,但默认情况下:
星期日= 1
Moday = 2
等
功能是:
DATEPART(dw,ads.date) as weekday
我需要结果:
星期日= 7
星期一= 1
等
有没有捷径可以做到这一点?或者我必须做CASE statement
?
答案 0 :(得分:52)
这样就可以了。
SET DATEFIRST 1;
-- YOUR QUERY
实施例
-- Sunday is first day of week
set datefirst 7;
select DATEPART(dw,getdate()) as weekday
-- Monday is first day of week
set datefirst 1;
select DATEPART(dw,getdate()) as weekday
答案 1 :(得分:34)
您可以使用如下公式:
(weekday + 5) % 7 + 1
如果您决定使用此功能,那么值得通过一些示例来说服自己确实实现了您想要的功能。
<强>除了强>: 为了不受DATEFIRST变量的影响(它可以设置为1到7之间的任何值),真正的公式是:
(weekday + @@DATEFIRST + 5) % 7 + 1
答案 2 :(得分:12)
您可以告诉SQL Server使用星期一作为一周的开始使用DATEFIRST,如下所示:
SET DATEFIRST 1
答案 3 :(得分:9)
我建议你自己使用datename()
编写案例陈述:
select (case datename(dw, aws.date)
when 'Monday' then 1
when 'Tuesday' then 2
when 'Wednesday' then 3
when 'Thursday' then 4
when 'Friday' then 5
when 'Saturday' then 6
when 'Sunday' then 7
end)
至少,如果有人在周开始的那一天更改参数,这不会改变。另一方面,它易受SQL Server选择的语言的影响。
答案 4 :(得分:1)
另一种解决方案如下:
ISNULL(NULLIF(DATEPART(dw,DateField)-1,0),7)
答案 5 :(得分:0)
我认为这可行:
select
case when datepart(dw,[Date]) = 1 then 7 else DATEPART(DW,[Date])-1 end as WeekDay
答案 6 :(得分:0)
这是由运行SQL Server服务的帐户引起的。例如;
如果SQL Server服务在DOMAIN \ MyUserAccount下运行,则需要登录并设置相关语言。
如果未设置此帐户,则SQL Server将默认为sa帐户以及运行该语言的语言。
我发现我们的sa帐户设置为英语,星期一的DW =2。DOMAIN \ MyUserAccount帐户已设置并更改为英式英语,星期一的DW返回为1。
希望这会有所帮助
答案 7 :(得分:0)
尝试一下:
CREATE FUNCTION dbo.FnDAYSADDNOWK(
@addDate AS DATE,
@numDays AS INT
) RETURNS DATETIME AS
BEGIN
WHILE @numDays > 0 BEGIN
SET @addDate = DATEADD(day, 1, @addDate)
IF DATENAME(DW, @addDate) <> 'sunday' BEGIN
SET @numDays = @numDays - 1
END
END
RETURN CAST(@addDate AS DATETIME)
END
答案 8 :(得分:0)
看起来DATEFIRST设置是唯一的方法,但是无法在标量/表值函数中创建SET语句。因此,遵循您的代码的同事很容易出错。 (成为其他人的陷阱)
实际上,应该改进SQL Server datepart函数以代替接受此参数。
与此同时,使用星期的英文名称似乎是最安全的选择。
答案 9 :(得分:0)
无论DATEFIRST
设置如何,您都可以使用此公式:
((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - [first day that you need] ) % 7) + 1;
monday = 1
((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 1 ) % 7) + 1;
和sunday = 1
((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 7 ) % 7) + 1;
和friday = 1
((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 5 ) % 7) + 1;
答案 10 :(得分:-1)
您需要设置DATEFIRST。看看这篇文章。我相信这应该有所帮助。
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-datefirst-transact-sql
答案 11 :(得分:-4)
我认为
DATEPART(dw,ads.date - 1) as weekday
会起作用。