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