我需要对具有索引的datetime
列的大型表执行查询。
我们需要查询从一个月(至少)到多个月的范围的数据。
此查询将从Cognos TM1执行,输入将是YYYYMM
之类的句点。我的问题是 - 如何将YYYYMM
输入转换为可用于查询该表的格式(使用索引)。
假设输入是
然后,我们需要在查询中将其转换为“在01-12-2013和31-12-2013之间”
由于我们需要将它连接到Cognos TM1中,因此无法编写过程或声明变量(TM1不知何故不喜欢它)。
提前感谢您的回复。
答案 0 :(得分:1)
假设您在varchar变量@datefrom中获得YYYYMM
的此值。
您可以执行类似
的操作DECLARE @DateFrom VARCHAR(6) = '201201';
-- Append '01' to any passed string 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
以ansi标准格式传递Datetime,YYYYMMDD
是一个sargable表达式,允许sql server利用在该datetime列上定义的索引。
这是一篇由 Rob Farley撰写的关于SARGable functions in SQL Server
的文章。
答案 1 :(得分:1)
我会做这样的事情:
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
答案 2 :(得分:0)
试试这个......
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
答案 3 :(得分:0)
在TM1 Turbo Integrator流程的数据源中,您可以使用SQL查询中的参数。例如。你可以采用这个SQL查询:
SELECT Col1, Col2
FROM Table
WHERE Col1 = 'Green'
AND Col2 < 30
在TM1中,为了对此进行参数化,您可以创建两个参数,例如: P1和P2并将它们放入查询中:
SELECT Col1, Col2
FROM Table
WHERE Col1 = '?P1?'
AND Col2 < ?P2?