使用DATEADD和DATEDIFF获取一周的开始日期(星期一)时出现问题



当用户输入其他日期时,我使用这个sql来获取一周的开始日期(星期一)

@StartDate有格式(yyyymmdd)

SQL: CAST(convert(varchar(12),DATEADD(week,DATEDIFF(week,0,@StartDate),0),112) as int

问题是,当输入的日期是从星期二到星期六时,它返回到当前星期的正确星期一。然而,当输入的日期是星期日时,它返回下周星期一的日期。

谁能告诉我我做错了什么
thank you

您的星期日与星期一属于同一周,这将使星期一成为一周的第一天。它应该修复你的查询

set datefirst 1

这个语法不关心数据库考虑一周的第一天是哪一天,它将计算@StartDate实际一周的星期一。

DATEADD(week, DATEDIFF(day, 0, @StartDate)/7, 0)

你可以这样测试:

SELECT DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0)

这行得通:

SELECT DATEPART(weekday, DATEADD(day, -1, CONVERT(DATETIME, @StartDate)))

另外,不要忘记先设置正确的日期格式:

SET DATEFORMAT ymd

你知道我是怎么做的吗?

SELECT max(cal_date)
FROM calendar
WHERE cal_date <= CURRENT_DATE
  AND day_of_week = 'Mon'

没有算术。速度快,在我的旧盒子上运行0.000082秒。日历表被索引;它可以有效地用于大型表的连接。

最重要的是——你可以看出这个查询显然是正确的。

最新更新