2017-01-24 1 views
1

I Daten Tabelle in nächsten 15 Jahren mit allen Terminen erstellt ...IF-Klausel in SQL-Prozedur

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 

Zweck davon ist, dass Zeitperioden in einigen Verfahren für die Berichterstattung zu verwenden. Also, Problem ist hier jetzt, wenn ich einige IF-Klausel am Anfang der Prozedur haben muss, wenn Parameter benötigt werden, weil ich den Kunden die Wahl geben muss, zwischen Monats- oder Quartalsbericht zu wählen. Für monatliche habe ich Code:

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)) 

Also, ich brauche so etwas wie wenn TIME_RANGE = Quartal dann ...

+0

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

+0

Diese 'convert (varchar (6), @ dt, 112)' gibt keinen Monat zurück – McNets

Antwort

1

Unter der Annahme, dass '201701' etc ist ein gültiger Wert für Ihre month Spalte, dann sollten Sie mit Start arbeiten und Ende Monate, und dann finden Sie die Daten für diese. Hier ist ein Beispiel, wie:

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) 

Bei Bedarf Sie Multiples IF s oder sogar eine CASE WHEN ... THEN ... ELSE ... END Anweisung verwenden könnte.