我用这个SQL得到一周的开始日(星期一),当用户输入的其他日子日期问题得到一周的开始日(星期一)
@StartDate具有格式(年月日)
SQL:CAST(convert(varchar(12),DATEADD(week,DATEDIFF(week,0,@StartDate),0),112) as int
的问题是,当输入的日期为周二至周六,它返回到当前周的周一正确。然而,当输入的日期是星期日时,它会在下周的星期一返回日期。
有谁能够告诉我,我做错了什么
谢谢
我用这个SQL得到一周的开始日(星期一),当用户输入的其他日子日期问题得到一周的开始日(星期一)
@StartDate具有格式(年月日)
SQL:CAST(convert(varchar(12),DATEADD(week,DATEDIFF(week,0,@StartDate),0),112) as int
的问题是,当输入的日期为周二至周六,它返回到当前周的周一正确。然而,当输入的日期是星期日时,它会在下周的星期一返回日期。
有谁能够告诉我,我做错了什么
谢谢
您周日属于同一周周一,这将使周一的一周的第一天。它应该解决您的查询
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'
没有算术。快速,在我的旧箱子上运行.000082秒。日历表是索引的;它可以有效地用于连接巨大的表格。
还有最重要的 - 你可以告诉查询显然是正确的。
并非所有数据库都有一个名为calendar的用户定义表。 –
@ t-clausen.dk但更多的数据库*应该*有一个日历表。 –
你为什么要把你的日期时间存储为一个整数?的[获取在SQL Server一周的第一天] –
可能重复(http://stackoverflow.com/questions/7168874/get-first-day-of-week-in-sql-server) –
@MartinSmith我们有很多有关如何获得本周第一天的问题,但您链接到的那一天不适用于查找第一天。你可以在这里测试我要求:设置DATEFIRST 7; SELECT [start_of_week] = DATEADD(WEEK,DATEDIFF(WEEK, '1900-01-01',CURRENT_TIMESTAMP-3), '1900-01-01'); –