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

在SQL Server中将YYYYMM格式转换为YYYY-MM-DD,sql,sql-server,date,cognos-tm1,Sql,Sql Server,Date,Cognos Tm1,我需要对一个大型表执行一个查询,该表有一个已编制索引的datetime列。 我们需要查询至少一个月到多个月的数据 这个查询将从CognosTM1执行,输入将是一个类似YYYYMM的周期。我的问题是-如何将YYYYMM输入转换为一种格式,用于查询使用索引的表 假设输入是 起始日期:201312 迄今为止:“201312” 然后,我们需要在查询中将其转换为“2013年12月1日至2013年12月31日之间” 因为我们需要在CognosTM1中连接它,所以我们无法编写过程或声明变量TM1不喜欢它 提前

我需要对一个大型表执行一个查询,该表有一个已编制索引的datetime列。 我们需要查询至少一个月到多个月的数据

这个查询将从CognosTM1执行,输入将是一个类似YYYYMM的周期。我的问题是-如何将YYYYMM输入转换为一种格式,用于查询使用索引的表

假设输入是

起始日期:201312 迄今为止:“201312” 然后,我们需要在查询中将其转换为“2013年12月1日至2013年12月31日之间”

因为我们需要在CognosTM1中连接它,所以我们无法编写过程或声明变量TM1不喜欢它


提前感谢您的回复。

假设您在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标准格式(即YYYYMMDD)传递Datetime是一个可搜索的表达式,允许sql server利用该Datetime列上定义的索引


这是罗布·法利写的一篇关于他的文章

我会这样做:

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
试试这个

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

在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?

你用什么语言工作?因为您将格式定义为YYYYMM,这让我相信您是从某个地方得到的,并且不能手动更改格式,对吗?TM1与Cognos TM1一样?我把它作为一个标签加上去了。如果数据库字段已编制索引,则必须确保在数据库列停止使用索引时,不会将任何函数包装在数据库列周围。我猜查询发生在Turbo Integrator中,因此您受到该工具的限制?感谢您的回复。我的错误-现在添加更多信息。我需要在一个sql语句中完成它,该语句将连接到TM1中,因此无法编写过程或声明变量。此外,正如我提到的,我需要运行一个完整的月相同的。那么,假设输入为'201312',我需要将其转换为'01-12-2013和31-12-2013'@ITGuy:它实际上必须是单个语句吗?您可以尝试将此过程的主体用作客户端脚本。无论如何,我相信这个答案说明了如何使用格式为YYYYMM的输入值作为日期间隔,也就是说,你实际上在问什么。@AndriyM:谢谢,它确实描述了需要实现的目标。但是,我不确定如何将其与TM1结合起来。在我们工作的环境中有许多限制。因此,调用proc或客户端脚本不是可行的选择。因此,我正在寻找一些可以在一个语句中完成的事情。最后,我们可能会在TM1中进行一些调整,并保持查询的原样。@ITGuy:好吧,您可以只使用此SP中的SELECT语句,并用相应的表达式替换WHERE子句中的变量,例如:t.date_of_record>=@yyyyymm+'01'和t.date_of_record