如果我选择@rpmMonth = 2019年9月,它应该将数据从2019年1月提取到2019年9月 **我只有一个参数值,即 VARCHAR 类型的@rpmMonth。
Declare @firstDay Date=(
select convert(varchar(10),DATEADD(Year,-1*DateDiff(Year,getdate(),0),0),120))
Declare @CurDate Date=(
SELECT convert(varchar(10),DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)),120))
select * from YOURTABLE
where colname between @firstDay and @CurDate
理想情况下,您应该使用date
数据类型,而不是varchar
。但是,如果我们确实必须使用varchar
那么您可以执行以下操作:
SELECT {Columns}
FROM {Your Schema And Table}
WHERE {DateColumn} >= CONVERT(date,CONCAT(RIGHT(@rpmMonth),'0101'))
AND {DateColumn} < DATEADD(MONTH, 1, CONVERT(date, '01 ' + @rpmMonth));
(显然替换大括号中的部分({}
(,并假设LOGIN
的语言是基于英语的语言。
这将为您提供@rpmMonth
年 1 月 1 日或之后以及@rpmMonth
年后一个月之前的所有行。
如果您使用正确的日期,并通过该月的第一个日期,即(2019-09-01
您给出的样本(,那么您可以执行以下操作:
SELECT {Columns}
FROM {Your Schema And Table}
WHERE {DateColumn} >= DATEADD(YEAR, DATEDIFF(YEAR, 0, @rpmMonth),0)
AND {DateColumn} < DATEADD(MONTH, 1, @rpmMonth);
SQL Server在转换日期值方面非常出色。 您应该能够执行以下操作:
select . . .
from t cross join
(values (convert(date, @rpmMonth)) as v(dte)
where datecol >= datefromparts(year(v.dte), 1, 1) and
datecol < datefromparts(year(dateadd(month, 1, v.dte)), month(dateadd(month, 1, v.dte)), 1)