2017-01-24 4 views
1

Я создал таблицу даты со всеми датами в ближайшие 15 лет ...IF пункт в процедуре SQL

CREATE TABLE [dbo].[All_Dates](
    [Year] [int] NOT NULL, 
    [Quarter] [nvarchar](6) NOT NULL, 
    [Month] [nvarchar](6) NOT NULL, 
    [Week] [nvarchar](7) NOT NULL, 
    [Day] [nvarchar](50) NOT NULL, 
    [DayKey] [tinyint] NOT NULL, 
    [DateName] [nvarchar](50) NOT NULL, 
    [DateKey] [date] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [DateKey] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

Цель этого заключается в использовании, что периоды времени в некоторых процедурах отчетности. Итак, проблема здесь сейчас, когда мне нужно иметь некоторое предложение IF о начале процедуры, когда требуются параметры, потому что мне нужно дать выбор клиентам выбирать между ежемесячным или ежеквартальным отчетом. Для ежемесячно у меня есть код:

ALTER procedure [dbo].[proc1] 

@dt date 

as 

declare @startdate date 
     ,@enddate date 
SET @StartDate = (select min(datekey) from TDW.dbo.All_Dates where month = convert(varchar(6),@dt,112)) 
SET @EndDate = (select max(datekey) from TDW.dbo.All_Dates where month = convert(varchar(6),@dt,112)) 

Итак, мне нужно что-то вроде, если промежуток_времени = четверть тогда ...

+0

https://msdn.microsoft.com/en-GB/library/ms182717.aspx –

+0

Этот 'convert (varchar (6), @ dt, 112)' не возвращает месяц – McNets

ответ

1

Предполагая, что '201701' и т.д. является допустимым значением для month столбца, то вы должны работать с начала и в конце месяца, а затем найдите даты для них. Вот пример того, как:

DECLARE @dt DATE = '2017-01-01' 
DECLARE @time_range VARCHAR(10) = 'quarter' 

DECLARE @startmonth VARCHAR(6) = convert(VARCHAR(6), @dt, 112) -- e.g. '201701' 
IF @time_range = 'quarter' SET @dt = DATEADD(m, 2, @dt) -- Assumed it is OK to change @dt 
DECLARE @endmonth VARCHAR(6) = convert(VARCHAR(6), @dt, 112) -- e.g. '201703' 

DECLARE @startdate DATE, @enddate DATE 
SET @StartDate = (select min(datekey) from TDW.dbo.All_Dates where month = @startmonth) 
SET @EndDate = (select max(datekey) from TDW.dbo.All_Dates where month = @endmonth) 

При необходимости можно использовать кратные IF с, или даже CASE WHEN ... THEN ... ELSE ... END заявление.