我想在范围之间选择日期。我有硬编码的日期和月份,但年份与它动态连接。我试图从表中选择这些范围之间的日期,但它并不总是给出给定范围之间的日期。
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日
答案 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
和@YearTo
为DD-MM-YYYY
,因此您需要在105
函数中使用CONVERT
RegistrationDate
为YYYY-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)
希望它有意义。