当前位置: 代码迷 >> Sql Server >> 请教一段关于日期转换句怎么更改
  详细解决方案

请教一段关于日期转换句怎么更改

热度:60   发布时间:2016-04-24 09:37:15.0
请问一段关于日期转换句如何更改
该语句最终目的是查询某月日(变量输入)至某月日(变量输入)内过生日的人,

DECLARE @t TABLE(ID int,Name varchar(10),Birthday varchar(10))
INSERT @t SELECT 1,'aa','1999-01-01'
UNION ALL SELECT 2,'bb','1996-02-29'
UNION ALL SELECT 3,'bb','1934-03-01'
UNION ALL SELECT 4,'bb','1966-04-01'
UNION ALL SELECT 5,'bb','1997-05-01'
UNION ALL SELECT 6,'bb','1922-11-21'
UNION ALL SELECT 7,'bb','1989-12-11'
DECLARE @dt1 varchar(10),@dt2 varchar(10)

--下面赋值这样查询无问题
set @dt1='2000-02-05'
set @dt2='2003-11-28'
--但是如果赋值一个变量就无效了
set @dt1=:dt1  --dt1是人工选择的一个日期,是2000-1-5这种格式
set@dt2=:dt2  --dt2也是人工选择一个日期
SELECT * FROM @t
WHERE DATEADD(Year,DATEDIFF(Year,Birthday,@dt1),Birthday)
        BETWEEN @dt1 AND @dt2
and DATEADD(Year,DATEDIFF(Year,Birthday,@dt2),Birthday)
        BETWEEN @dt1 AND @dt2

请问如何更改,实际中提示:必须声明标量变量,更改@DT1为'''+@dt1+''' 最后查询结果无过滤效果了
------解决思路----------------------
引用:
找到原因了,确实是空值的原因,过滤空值后查询有效果,但是查询的结果都是小于,@P8startDate 月日的,为什么呢
中间为什么是or,感觉是and才对,or查旬结果是全部的好像

你试下以下脚本
DECLARE @t TABLE(ID int,Name varchar(10),Birthday varchar(10))
INSERT @t SELECT 1,'aa','1999-01-01'
UNION ALL SELECT 2,'bb','1996-02-29'
UNION ALL SELECT 3,'bb','1934-03-01'
UNION ALL SELECT 4,'bb','1966-04-01'
UNION ALL SELECT 5,'bb','1997-05-01'
UNION ALL SELECT 6,'bb','1922-11-21'
UNION ALL SELECT 7,'bb','1989-12-11'
DECLARE @P8startDate DATETIME,@P9endDate DATETIME
--set @P8startDate=:P8startdate
--set @P9endDate=:P9enddate
SET @P8startDate='2014-12-01'
SET @P9endDate='2015-02-28'
SELECT * FROM @t WHERE
    DATEADD(Year,DATEDIFF(Year,Birthday,@P8startDate),Birthday) BETWEEN @P8startDate AND @P9endDate
    OR DATEADD(Year,DATEDIFF(Year,Birthday,@P9endDate),Birthday) BETWEEN @P8startDate AND @P9endDate

这个脚本的结果是,
/*
1 aa 1999-01-01
2 bb 1996-02-29
7 bb 1989-12-11
*/
如果这是你想的结果就没有错~

空值,是输入查询参数的空值还是,Birthday的空值呢?
Birthday建议储存为 DATETIME 占用空间比VARCHAR(10)小~

用OR原因是
那个条件判断就变成以下的判断
把Birthday的年数改为和@P8startDate一样的年数,或改为和@P9endDate一样的年数时,必须在P8startDate和@P9endDate的范围之间。
因此,
1 aa 1999-01-01 2014-01-01X  2015-01-01√
2 bb 1996-02-29 2014-02-28X  2015-02-28√
7 bb 1989-12-11 2014-12-11√  2015-12-11X
这些数据是符合的,改成AND的话,就一个值也没有了~
------解决思路----------------------
IF @dt1 <= @dt2
BEGIN
    SELECT * FROM @t
     WHERE RIGHT(Birthday,5) BETWEEN @dt1 AND @dt2
END
ELSE -- 考虑跨年底的情况
BEGIN
    SELECT * FROM @t
     WHERE @dt1 <= RIGHT(Birthday,5)
        OR RIGHT(Birthday,5) <= @dt2
END
  相关解决方案