Ste*_*eph 1 sql t-sql datetime sql-server-2005 sql-server-2008
因此,对于开始日期和结束日期,我想确定这两个日期之间一周的特定日期.
那么星期一,星期二等等
我知道我可以在开始日期和结束日期之间循环并检查每一天,但差异可能是很多天.我更喜欢不需要循环的东西.有任何想法吗?(必须在SQL Server 2005+中受支持)
鉴于我认为你想要得到的,这应该做到:
SET DATEFIRST 1
DECLARE
@start_date DATETIME,
@end_date DATETIME
SET @start_date = '2011-07-11'
SET @end_date = '2011-07-22'
;WITH Days_Of_The_Week AS (
SELECT 1 AS day_number, 'Monday' AS day_name UNION ALL
SELECT 2 AS day_number, 'Tuesday' AS day_name UNION ALL
SELECT 3 AS day_number, 'Wednesday' AS day_name UNION ALL
SELECT 4 AS day_number, 'Thursday' AS day_name UNION ALL
SELECT 5 AS day_number, 'Friday' AS day_name UNION ALL
SELECT 6 AS day_number, 'Saturday' AS day_name UNION ALL
SELECT 7 AS day_number, 'Sunday' AS day_name
)
SELECT
day_name,
1 + DATEDIFF(wk, @start_date, @end_date) -
CASE WHEN DATEPART(weekday, @start_date) > day_number THEN 1 ELSE 0 END -
CASE WHEN DATEPART(weekday, @end_date) < day_number THEN 1 ELSE 0 END
FROM
Days_Of_The_Week
Run Code Online (Sandbox Code Playgroud)
我不确定OP之后是什么,这将每周计算一次:
SET DATEFIRST 1
DECLARE @StartDate datetime
,@EndDate datetime
SELECT @StartDate='7/13/2011'
,@EndDate='7/28/2011'
;with AllDates AS
(
SELECT @StartDate AS DateOf, datename(weekday,@StartDate) AS WeekDayName, datepart(weekday,@StartDate) AS WeekDayNumber
UNION ALL
SELECT DateOf+1, datename(weekday,DateOf+1), datepart(weekday,DateOf+1)
FROM AllDates
WHERE DateOf<@EndDate
)
SELECT COUNT(*) CountOf,WeekDayName FROM AllDates GROUP BY WeekDayName,WeekDayNumber ORDER BY WeekDayNumber
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
CountOf WeekDayName
----------- ------------------------------
2 Monday
2 Tuesday
3 Wednesday
3 Thursday
2 Friday
2 Saturday
2 Sunday
(7 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
这将计算周一至周五的日期:
SET DATEFIRST 1
DECLARE @StartDate datetime
,@EndDate datetime
SELECT @StartDate='7/13/2011'
,@EndDate='7/28/2011'
;with AllDates AS
(
SELECT @StartDate AS DateOf, datepart(weekday,@StartDate) AS WeekDayNumber
UNION ALL
SELECT DateOf+1, datepart(weekday,DateOf+1)
FROM AllDates
WHERE DateOf<@EndDate
)
SELECT COUNT(*) AS WeekDayCount FROM AllDates WHERE WeekDayNumber<=5
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
WeekDayCount
------------
12
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
如果您有假期表,您可以加入并删除它们.这是一个稍微不同的版本,可以更好地执行:
SET DATEFIRST 1
DECLARE @StartDate datetime
,@EndDate datetime
SELECT @StartDate='7/13/2011'
,@EndDate='7/28/2011'
;with AllDates AS
(
SELECT @StartDate AS DateOf, datepart(weekday,getdate()) AS WeekDayNumber
UNION ALL
SELECT DateOf+1, (WeekDayNumber+1) % 7
FROM AllDates
WHERE DateOf<@EndDate
)
SELECT COUNT(*) AS WeekDayCount FROM AllDates WHERE WeekDayNumber>0 AND WeekDayNumber<6
--I don't like using "BETWEEN", ">", ">=", "<", and "<=" are more explicit in defining end points
Run Code Online (Sandbox Code Playgroud)
产生与原始查询相同的输出.
| 归档时间: |
|
| 查看次数: |
10893 次 |
| 最近记录: |