为什么给定范围之间的日期没有被选中?

时间:2017-08-15 06:57:57

标签: sql sql-server tsql stored-procedures sql-server-2014

我想在范围之间选择日期。我有硬编码的日期和月份,但年份与它动态连接。我试图从表中选择这些范围之间的日期,但它并不总是给出给定范围之间的日期。

Declare @year varchar(10)
Set @year= '2017-2018'

Declare @YearFrom varchar(15)
Set @YearFrom= (Select SUBSTRING(@year, 1, 4) )
Declare @YearTo varchar(15)
Set @YearTo= (Select SUBSTRING(@year, 6, 9) )

Set @YearFrom= '01-07-'+@YearFrom
Set @YearTo= '30-06-'+@YearTo

Select Convert(varchar(11),c.RegistrationDate,106)  from Contractors c
where Convert(varchar(11),c.RegistrationDate,106) between Convert(varchar(11),@yearFrom,106)
 and Convert(varchar(11),@YearTo,106)

注册日期保存为:

YYYY-MM-DD,例如2017年7月3日

2 个答案:

答案 0 :(得分:1)

解决此问题的另一种方法是使用DATEFROMPARTS,其中年,月和日输入转换为日期,如下所示:

Declare @year varchar(10)
Set @year= '2017-2018'

Declare @YearFrom int
Set @YearFrom= (Select SUBSTRING(@year, 1, 4) ) 

Declare @YearTo int
Set @YearTo= (Select SUBSTRING(@year, 6, 9) ) 

Declare @StartDate date
Set @StartDate = DATEFROMPARTS(@YearFrom,1,7)

Declare @EndDate date
Set @EndDate = DATEFROMPARTS(@YearTo,6,30)

现在,您可以在与注册日期进行比较时使用@StartDate和@EndDate。

答案 1 :(得分:0)

首先,如果您想比较日期,则无法使用VARCHAR值,您应该使用您要查找的实际类型DATETIME

其次,您有2种日期格式

  • @YearFrom@YearToDD-MM-YYYY,因此您需要在105函数中使用CONVERT

  • RegistrationDateYYYY-MM-DD,因此您需要在120函数中使用CONVERT

考虑到这一点,请参阅以下查询:

    Declare @year varchar(10)
    Set @year= '2017-2018'

    Declare @YearFrom varchar(15)
    Set @YearFrom= (Select SUBSTRING(@year, 1, 4) )
    Declare @YearTo varchar(15)
    Set @YearTo= (Select SUBSTRING(@year, 6, 9) )

    Set @YearFrom= '01-07-'+@YearFrom
    Set @YearTo= '30-06-'+@YearTo

    ;with Contractors AS (
        SELECT  *
        FROM    (VALUES ('2018-05-01'),('2018-07-01')) AS V(RegistrationDate)
    )
    Select *
    from Contractors c
    where Convert(DATETIME,c.RegistrationDate,120) between Convert(DATETIME,@yearFrom,105) and Convert(DATETIME,@YearTo,105)

希望它有意义。