SQL查询,用于在表获取年和月字段时获取日期范围的结果

SQL查询,用于在表获取年和月字段时获取日期范围的结果,sql,sql-server,date,where,where-clause,Sql,Sql Server,Date,Where,Where Clause,我有一个包含年和月字段的表。我需要选择两个特定日期之间的行。如何在where条件下设置此选项? 尝试使用“中间” 大概是这样的: 从表中选择销售金额,其中年份介于2015年和2016年之间,月份介于6和8之间,您不太清楚“之间”在本文中的含义。我确信datefromparts()会非常有用: select t.* from t where @date_start <= datefromparts(year, month, 1) and @date_end >= datef

我有一个包含年和月字段的表。我需要选择两个特定日期之间的行。如何在where条件下设置此选项?

尝试使用“中间”

大概是这样的:


从表中选择销售金额,其中年份介于2015年和2016年之间,月份介于6和8之间,您不太清楚“之间”在本文中的含义。我确信
datefromparts()
会非常有用:

select t.*
from t
where @date_start <= datefromparts(year, month, 1) and
      @date_end >= datefromparts(year, month, 1);
选择t*
从t
其中@date\u start=datefromparts(年、月、1);

如果月底是一个重要的日期,您可能也会发现它很有用。

您可以使用日期的帮助month()、year()函数进行尝试

以下是一个例子:

从t中选择*,其中(t.月=月('2017-01-01')和t.年=年('2017-01-01'))和(t.月=月('2017-05-01')和t.年=年('2017-05-01')

下面是sql中month()的链接。


这可能会帮助您解决问题。

您也可以尝试以下方法:

select
  d.*
from
  (select
    t.*,
    cast(rtrim(cast([month] as char(2))) + '/1/' + cast ([year] as char(4)) as date) as dt) d
where
dt >= @dateStart and
dt <= @dateEnd
选择
d*
从…起
(选择
t、 *,
铸造(rtrim(铸造([月份]为字符(2)))+'/1/'+铸造([年份]为字符(4))为日期)为dt)d
哪里
dt>=@dateStart和

dt如果年和月的值是整数,则可以将它们转换为varchar,然后转换为date,并使用BETWEEN。声明startdate和enddate变量的示例:

DECLARE @startdate date = '2015-07-01'
       ,@enddate   date = '2016-07-01'

SELECT *       
  FROM @myTable
WHERE CAST(CAST(Year as varchar) + '-' + CAST(Month as varchar) + '-01' as date) 
      BETWEEN @startdate AND @enddate
如果它们是char或varchar,则您只需在以下日期之间使用:

DECLARE @startdate date = '2015-07-01'
       ,@enddate   date = '2016-07-01'

SELECT *       
  FROM @myTable
WHERE CAST(Year + '-' + Month + '-01' as date) 
      BETWEEN @startdate AND @enddate

编辑您的问题,并为您正在使用的数据库提供示例数据、所需结果和标记。例如
…where yearcol*100+monthcol在201601和201612之间的位置
您使用的是哪种产品?博士后?神谕“SQL”只是一种查询语言,不是特定数据库产品的名称。我使用SQL server。年份和日期是否存储为数字(而不是字符串?)很好:),但我认为它只在SQL server 2012中可用onwards@Grantly . . . 嗯,是的,那个软件已经推出5年多了。哈哈,是的,我真的落后了。刚才提到了它,以防像我这样的人在使用该函数时遇到问题。我有很多版本正在运行,但仍然不到20122014(尽管我的一些客户)非常确定这个问题需要两个日期之间的结果,而不是两个日期-这看起来无论如何都不起作用…但是很好的尝试。也许你可以改进你的答案?