ALTER PROCEDURE sp_SelectDate @Begin varchar(50), @End varchar(50), @YTCode varchar(50) AS SELECT * FROM [Table] where datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@Begin)>0 and datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@End)<0
--上面的要求@begin/@end是YYYYMMDD的格式--如果@begin/@end是YYYYMM的格式,则用: ALTER PROCEDURE sp_SelectDate @Begin varchar(50), @End varchar(50), @YTCode varchar(50) AS SELECT * FROM [Table] where datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@Begin+'01')>0 and datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@End+'01')<0
year/month是什么类型? ----------------------- 都是varchar,是两个独立的字段,想组合查询,可不行。第二种方法优先比较月份,对年份比较无效。 表中year、month是什么类型,还有@begin、@end怎么不用datetime而是varchar(50)? ------------------------------------ 写的存贮过程,和表的year,month字段对应,第二个村出国城是这样的: ALTER PROCEDURE sp_SelectDateSpare @BeginYear varchar(50), @BeginMonth varchar(50), @EndYear varchar(50), @EndMonth varchar(50), @YTCode varchar(50) AS SELECT * FROM YT_Summary WHERE YT_Summary.cYear >= @BeginYear AND YT_Summary.cMonth >= @BeginMonth AND YT_Summary.cYear <= @EndYear AND YT_Summary.cMonth <= @EndMonth AND ytcode = @YTCode
谢谢啊! 可是用 zjcxc(邹建) 的第二种方法 把变量换成了200401和200501在查询分析器里测了一下,检索不到应得的数据。SELECT * FROM YT_Summary where datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),200401+'01')>0 and datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),200501+'01')<0
--晕,照我的写法,是你那样加的吗? 你怎么能不区分参数类型呢?--你定义的是字符型的参数,所以直接带变量值到查询语句中,应该是执行这样的查询语句 SELECT * FROM YT_Summary where datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),'200401'+'01')>0 and datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),'200501'+'01')<0
@Begin varchar(50),
@End varchar(50),
@YTCode varchar(50)
AS
SELECT *
FROM [Table]
where
datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@Begin)>0
and
datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@End)<0
ALTER PROCEDURE sp_SelectDate
@Begin varchar(50),
@End varchar(50),
@YTCode varchar(50)
AS
SELECT *
FROM [Table]
where
datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@Begin+'01')>0
and
datediff(month,dateadd(month,[month]-1,dateadd(year,[year]-1900,0)),@End+'01')<0
-----------------------
都是varchar,是两个独立的字段,想组合查询,可不行。第二种方法优先比较月份,对年份比较无效。
表中year、month是什么类型,还有@begin、@end怎么不用datetime而是varchar(50)?
------------------------------------
写的存贮过程,和表的year,month字段对应,第二个村出国城是这样的:
ALTER PROCEDURE sp_SelectDateSpare
@BeginYear varchar(50),
@BeginMonth varchar(50),
@EndYear varchar(50),
@EndMonth varchar(50),
@YTCode varchar(50)
AS
SELECT *
FROM YT_Summary
WHERE
YT_Summary.cYear >= @BeginYear
AND
YT_Summary.cMonth >= @BeginMonth
AND
YT_Summary.cYear <= @EndYear
AND
YT_Summary.cMonth <= @EndMonth
AND ytcode = @YTCode
可是用 zjcxc(邹建) 的第二种方法 把变量换成了200401和200501在查询分析器里测了一下,检索不到应得的数据。SELECT *
FROM YT_Summary
where
datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),200401+'01')>0
and
datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),200501+'01')<0
解决方法: 一、表中字段与存储过程中的变量改用合理的数据类型。二、比较运算中转换成日期型进行比较,不要以字符型直接比较。-----------------------------------------------------------------
这个客户管理的时候想出月表,不用日,所以只要求输入年、月。20040101和20050101这种格式是可以的,可在存贮过程中怎么加上日呢?然后再和在输入的时候加了日期的比较就行,不过直接比较年+月咋不行呢。
SELECT *
FROM YT_Summary
where
datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),'200401'+'01')>0
and
datediff(month,dateadd(month,[cMonth]-1,dateadd(year,[cYear]-1900,0)),'200501'+'01')<0
还是建议建表时就把日期和时间都定为varchar以后查询起来也方便!
-------------------------------
年和日是两个单独的字段,是Varchar的。本来以为挺简单的,没想到这么麻烦。
FROM YT_Summary
WHERE YT_Summary.cYear + YT_Summary.cMonth >= 200501 AND YT_Summary.cYear + YT_Summary.cMonth <= 200501