我想获得第二的数量和第4个周六的 2之间的日期如何获得第二的数量和第四使用SQL查询
防爆周六的日期正好介于2:
DECLARE @FromDate date='08/01/2016'
DECLARE @ToDate date='09/20/2016'
请帮帮我 提前感谢..
我想获得第二的数量和第4个周六的 2之间的日期如何获得第二的数量和第四使用SQL查询
防爆周六的日期正好介于2:
DECLARE @FromDate date='08/01/2016'
DECLARE @ToDate date='09/20/2016'
请帮帮我 提前感谢..
我使用UDF来创建动态的日期范围,但理货/日期表会做的伎俩以及
with cteBase as (
Select *
,RowNr=Row_Number() over (Order by RetVal)
From [dbo].[udf-Create-Range-Date]('2016-08-01','2016-09-20','DD',1)
Where DateName(DW,RetVal)='Saturday'
)
Select RetVal From cteBase Where RowNr in (2,4)
返回
RetVal
2016-08-13 00:00:00.000
2016-08-27 00:00:00.000
如果需要
CREATE FUNCTION [dbo].[udf-Create-Range-Date] (@DateFrom datetime,@DateTo datetime,@DatePart varchar(10),@Incr int)
Returns
@ReturnVal Table (RetVal datetime)
As
Begin
With DateTable As (
Select DateFrom = @DateFrom
Union All
Select Case @DatePart
When 'YY' then DateAdd(YY, @Incr, df.dateFrom)
When 'QQ' then DateAdd(QQ, @Incr, df.dateFrom)
When 'MM' then DateAdd(MM, @Incr, df.dateFrom)
When 'WK' then DateAdd(WK, @Incr, df.dateFrom)
When 'DD' then DateAdd(DD, @Incr, df.dateFrom)
When 'HH' then DateAdd(HH, @Incr, df.dateFrom)
When 'MI' then DateAdd(MI, @Incr, df.dateFrom)
When 'SS' then DateAdd(SS, @Incr, df.dateFrom)
End
From DateTable DF
Where DF.DateFrom < @DateTo
)
Insert into @ReturnVal(RetVal) Select DateFrom From DateTable option (maxrecursion 32767)
Return
End
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','YY',1)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','DD',1)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-31','MI',15)
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-02','SS',1)
编辑到
with cteBase as (
Select *
,RowNr=Row_Number() over (Order by RetVal)
From [dbo].[udf-Create-Range-Date]('2016-09-17','2016-10-29','DD',1)
Where DateName(DW,RetVal)='Saturday'
)
Select RetVal From cteBase Where RowNr % 2 = 0
退换货范围之内返回每隔周六UDF
RetVal
2016-09-24 00:00:00.000
2016-10-08 00:00:00.000
2016-10-22 00:00:00.000
许多非常感谢:)@约翰Cappelletti – Sreevardhan
@约翰Cappelletti,它不计算第二和第四个星期六在Todate – Sreevardhan
@Sreevardhan我不明白。给我一点时间审查。 ToDate是什么意思? –
你应该养成创建日历表的习惯。如果您根据日期处理大量缺口和岛屿问题或进行大量以日期为中心的处理,它将节省大量时间。同时,我建议您在此期间建立一个内存表来处理您的查询。
DECLARE @DATES TABLE
(
Day INT,
Month INT,
Year INT,
DayInWeek INT,
WeekInYear INT
CalendarDate DATETIME
)
DECLARE @FromDate date='08/01/2016'
DECLARE @ToDate date='09/20/2016'
WHILE(@FromDate<[email protected]) BEGIN
INSERT INTO @DATE DATEPART(DAY,@FromDate....)
SET @FromDate=DATEADD(DAY,1,@FromDate)
END
SELECT
*
FROM
(
SELECT
*
FROM
@DATE D
LEFT OUTER JOIN
(
...My Query
) MQ ON MQ.Date=D.CalendarDate
)AS X
呀..你对@罗斯 – Sreevardhan
declare @startDate datetime = '2016-09-16'
declare @endDate datetime = '2016-10-12'
declare @DayName Varchar(20) = 'Saturday'
declare @SelectionType Varchar(20) = '1 And 4'
-- '1 And 4','1 And 3','2 And 4','All' we can pass what ever we want
declare @MothstartDateofStartDate datetime
SELECT @MothstartDateofStartDate = DATEADD(month, DATEDIFF(month, 0, @startDate), 0)-1
;with dateRange as
(
select [Date] = dateadd(dd, 1, @MothstartDateofStartDate), datename(dw,dateadd(dd, 1, @MothstartDateofStartDate)) [DayName]
where dateadd(dd, 1, @MothstartDateofStartDate) < @endDate
union all
select dateadd(dd, 1, [Date]), datename(dw,dateadd(dd, 1, [Date])) [DayName]
from dateRange
where dateadd(dd, 1, [Date]) < @endDate
)
select count(*) from (
select [Date],T0.[DayName],(select count(*) from dateRange T1
where T1.Date between DATEADD(month, DATEDIFF(month, 0, T0.Date), 0) and T0.Date And T1.[DayName] =T0.[DayName]
group By T1.[DayName]) PlaceCount
from dateRange T0 where T0.Date >[email protected]) AA
where AA.[DayName]= @DayName
and
'True'=case when @SelectionType ='1 And 4' then case when PlaceCount in(1,4) then 'True' else 'False' end
when @SelectionType ='1 And 3' then case when PlaceCount in(1,3) then 'True' else 'False' end
when @SelectionType ='2 And 4' then case when PlaceCount in(2,4) then 'True' else 'False' end
when @SelectionType ='All' then 'True' end
只是一个想法。为什么你想这样做的逻辑在后台?你可以在中间层或上层礼仪中做到这一点? –