【问题标题】:Why are the dates between a given range not getting picked?为什么没有选择给定范围之间的日期?
【发布时间】:2018-01-23 01:55:45
【问题描述】:

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

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-07-03

【问题讨论】:

  • 不要在 varchar 中存储日期,使用正确的数据类型!
  • 有可能在那些没有给出结果的情况下where date between date1 and date2date1大于date2

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


【解决方案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 与注册日期进行比较。

【讨论】:

    【解决方案2】:

    首先,如果你想比较日期,你不能使用 VARCHAR 值,你应该使用你正在寻找的实际类型,DATETIME

    其次,你有两种日期格式

    • @YearFrom@YearToDD-MM-YYYY,所以需要在CONVERT函数中使用105

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

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

        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)
    

    希望它有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      相关资源
      最近更新 更多