需要sql指令,它可以告诉我日期的第几周。 搜索解决方案,但没有人能按预期工作。
第一
declare @date datetime = '2019-09-01'
select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1
结果-0
declare @date datetime = '2019-09-30'
select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1
结果-5
再检查一个月-2019-08-01(结果1)和2019-08-31(结果5)
第二:
declare @d datetime = '2019-09-01'
select (day(@d)+datepart(weekday,dateadd(day,1-day(@d),@d))-datepart(weekday,@d))/7+1
结果-1
declare @d datetime = '2019-09-30'
select (day(@d)+datepart(weekday,dateadd(day,1-day(@d),@d))-datepart(weekday,@d))/7+1
结果-5(必须为6)
以及其他无法根据需要提供结果的解决方案。
问题在一周的第一天-必须是星期一,而不是星期日。以9月为例,需要9月01日-第一周,9月02日-第二周,等等。
也许还有其他指示?
答案 0 :(得分:1)
如果使用默认的一周的第一天,则2019年9月30日位于第五周,而不是第六周。由DATEFIRST设置指定。这会影响日期计算,例如DATEADD
和DATEPART(weekday)
如果要在第一天(如星期一)使用不同,则必须使用
更改设置SET DATEFIRST 1;
进行更改后,上一个查询对2019-09-01
和2019-09-30
都有效
set datefirst 1
declare @date datetime = '2019-09-30'
select (day(@date)+datepart(weekday,dateadd(day,1-day(@date),@date))- datepart(weekday,@date))/7+1
这将返回6。对于2019-01-01
,它将返回1
答案 1 :(得分:0)
我认为您已经使它有些复杂了。
尝试一下:
DECLARE @d datetime = '2019-09-30'
--Get the day of the month
DECLARE @DayOfMonth DECIMAL(18,6) = DATEPART(DAY, @d)
--Divide by 7 (as a decimal) and round up.
SELECT CEILING(@DayOfMonth / 7.0)
哪个给你
Day Week
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 2
9 2
10 2
11 2
12 2
13 2
14 2
15 3
16 3
17 3
18 3
19 3
20 3
21 3
22 4
23 4
24 4
25 4
26 4
27 4
28 4
29 5
30 5
31 5
答案 2 :(得分:0)
这是一个输出每个日期一个月中星期几的代码
{
ViewData["CurrentFilter"] = searchData;
var profile = _context.Profile
.Include (p => p.Industry)
.Include (p => p.InfluenceLevel)
.Include (p => p.OwnershipLevel)
.Include (p => p.Perspective)
.Include (p => p.Role)
.OrderByDescending (p => p.ProfileName);
if (!string.IsNullOrEmpty (searchData)) {
profile = profile.Where (p =>
p.ProfileName.Contains (searchData)); //Here is the error
}