2011-08-31 68 views
3

我用这个SQL得到一周的开始日(星期一),当用户输入的其他日子日期问题得到一周的开始日(星期一)

@StartDate具有格式(年月日)

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

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

有谁能够告诉我,我做错了什么
谢谢

+0

你为什么要把你的日期时间存储为一个整数?的[获取在SQL Server一周的第一天] –

+0

可能重复(http://stackoverflow.com/questions/7168874/get-first-day-of-week-in-sql-server) –

+0

@MartinSmith我们有很多有关如何获得本周第一天的问题,但您链接到的那一天不适用于查找第一天。你可以在这里测试我要求:设置DATEFIRST 7; SELECT [start_of_week] = DATEADD(WEEK,DATEDIFF(WEEK, '1900-01-01',CURRENT_TIMESTAMP-3), '1900-01-01'); –

回答

4

您周日属于同一周周一,这将使周一的一周的第一天。它应该解决您的查询

set datefirst 1 

这句法不关心什么日子数据库正在考虑周的第一天,它会计算你的@StartDate的实际周的星期一。

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

你可以用这个测试:

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

这工作:

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

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

SET DATEFORMAT ymd 
1

你知道我是怎么做到的?

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

没有算术。快速,在我的旧箱子上运行.000082秒。日历表是索引的;它可以有效地用于连接巨大的表格。

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

+0

并非所有数据库都有一个名为calendar的用户定义表。 –

+1

@ t-clausen.dk但更多的数据库*应该*有一个日历表。 –

相关问题