J'ai besoin d'effectuer une requête sur une grande table qui a une colonne datetime
indexée. Nous devons interroger datatables pour une plage allant d'un mois (au minimum) à plusieurs mois.
Cette requête serait exécutée à partir de Cognos TM1 et l'input serait une période telle que YYYYMM
. Ma question est – comment convertir l'input YYYYMM
dans un format qui peut être utilisé pour interroger cette table (avec l'index utilisé).
Disons si l'input est
Ensuite, nous avons besoin de convertir la même chose entre «01-12-2013 et 31-12-2013» dans la requête
Puisque nous avons besoin que cela soit relié à Cognos TM1, nous ne serions pas en mesure d'écrire une procédure ou de déclarer des variables (TM1 ne l'aime pas du tout).
Merci d'avance pour votre réponse.
Je ferais quelque chose comme ça:
create procedure dbo.getDataForMonth @yyyymm char(6) = null as -- -- use the current year/month if the year or month is invalid was omitted -- set @yyyymm = case coalesce(@yyyymm,'') when '' then convert(char(6),current_timestamp,112) else @yyyymm end -- -- this should throw an exception if the date is invalid -- declare @dtFrom date = convert(date,@yyyymm+'01') -- 1st of specified month declare @dtThru date = dateadd(month,1,@dtFrom) -- 1st of next month -- -- your Big Ugly Query Here -- select * from dbo.some_table t where t.date_of_record >= @dtFrom and t.date_of_record < @dtThru -- -- That's about all there is to it. -- return 0 go
Supposons que vous obtenez cette valeur de YYYYMM
dans une variable varchar @datefrom.
Vous pouvez faire quelque chose comme
DECLARE @DateFrom VARCHAR(6) = '201201'; -- Append '01' to any passed ssortingng and it will get all -- records starting from that month in that year DECLARE @Date VARCHAR(8) = @DateFrom + '01' -- in your query do something like SELECT * FROM TableName WHERE DateTimeColumn >= @Date
Passage de Datetime dans un format ansi-standard Par exemple, YYYYMMDD
est une expression sargable qui permet au server sql de tirer parti des index définis sur cette colonne datetime.
Voici un article écrit par Rob Farley sur les SARGable functions in SQL Server
.
Essaye ça…
declare @startdate date,@endate date select @startdate =convert(date,left('201312',4)+'-'+right('201312',2)+'-01') select @endate= DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, @startdate) + 1, 0)) select convert(date,@startdate,102) startdate,convert(date,@endate,102) endate
Dans la source de données de votre process TM1 Turbo Integrator, vous pouvez utiliser des parameters dans la requête SQL. Par exemple, vous pouvez prendre cette requête SQL:
SELECT Col1, Col2 FROM Table WHERE Col1 = 'Green' AND Col2 < 30
Dans TM1, pour paramétrer ceci, vous devez créer deux parameters, par exemple P1 et P2, et les placer dans la requête:
SELECT Col1, Col2 FROM Table WHERE Col1 = '?P1?' AND Col2 < ?P2?