2016-09-23 81 views
0

我想獲得第二的數量和第4個週六的 2之間的日期如何獲得第二的數量和第四使用SQL查詢

防爆週六的日期正好介於2:

DECLARE @FromDate date='08/01/2016' 
DECLARE @ToDate date='09/20/2016' 

請幫幫我 提前感謝..

+0

只是一個想法。爲什麼你想這樣做的邏輯在後臺?你可以在中間層或上層禮儀中做到這一點? –

回答

1

我使用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 
+0

許多非常感謝:)@約翰Cappelletti – Sreevardhan

+0

@約翰Cappelletti,它不計算第二和第四個星期六在Todate – Sreevardhan

+0

@Sreevardhan我不明白。給我一點時間審查。 ToDate是什麼意思? –

0

你應該養成創建日曆表的習慣。如果您根據日期處理大量缺口和島嶼問題或進行大量以日期爲中心的處理,它將節省大量時間。同時,我建議您在此期間建立一個內存表來處理您的查詢。

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   
+0

呀..你對@羅斯 – Sreevardhan

0
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 
相關問題