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

时间:2011-08-31 10:21:37

标签: sql sql-server sql-server-2005 tsql

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

@StartDate有格式(yyyymmdd)

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

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

任何人都可以告诉我我做错了什么
谢谢

3 个答案:

答案 0 :(得分:4)

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

set datefirst 1

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

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

你可以用这个来测试:

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

答案 1 :(得分:1)

这有效:

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

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

SET DATEFORMAT ymd

答案 2 :(得分:1)

你知道我是怎么做到的吗?

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

没算术。快,在我的旧盒子上运行.000082秒。日历表已编入索引;它可以有效地用于连接巨大的桌子。

最重要的是 - 你可以告诉查询显然是正确的。