在SQL Server中将YYYYMM格式转换为YYYY-MM-DD

时间:2014-10-15 23:16:52

标签: sql sql-server date cognos-tm1

我需要对具有索引的datetime列的大型表执行查询。 我们需要查询从一个月(至少)到多个月的范围的数据。

此查询将从Cognos TM1执行,输入将是YYYYMM之类的句点。我的问题是 - 如何将YYYYMM输入转换为可用于查询该表的格式(使用索引)。

假设输入是

  • 日期:'201312'
  • 至今:'201312'

然后,我们需要在查询中将其转换为“在01-12-2013和31-12-2013之间”

由于我们需要将它连接到Cognos TM1中,因此无法编写过程或声明变量(TM1不知何故不喜欢它)。

提前感谢您的回复。

4 个答案:

答案 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?