【问题标题】:SQL Server select date year/month portion only without day and with comparisonSQL Server 仅选择日期年/月部分,没有日期和比较
【发布时间】:2018-03-14 17:32:09
【问题描述】:

我在一个表中有一个列表,其中包含 StartDate (not null)EndDate (null)(类型均为 date,没有时间)。

活动条目是具有StartDate <= querydateEndDate with null or > querydate 的条目。

所以我的查询基本上是这样的

SELECT * 
FROM MyDataTable 
WHERE StartDate <= mydate 
  AND (EndDate IS NULL OR EndDate >= mydate )

对于图表中的统计数据,我想知道在过去几个月的特定月份中哪些是活跃的。我在一年和一个月(2017-10、2017-11、2017-12、2018-1、...)中循环(以编程方式)

如何使用程序循环的年份和月份选择所有活动条目,但忽略日期部分?

【问题讨论】:

  • 以后不要描述你的表和数据。显示表定义,提供示例数据,并给出输出示例。它使它更容易理解。
  • 如果您以编程方式执行此操作,则可以从 myDate 中提取月份和年份。因此,假设myDate 有 10 个月和 2017 年,则将查询修改为 SELECT * FROM MyDataTble Where Month(date)='10' &amp;&amp; YEAR(date)='2017 并进行比较。

标签: sql sql-server date select


【解决方案1】:

如果您想要整个月的活动:

SELECT *
FROM MyDataTable
WHERE StartDate <= '2017-10-01' AND 
      (EndDate IS NULL OR EndDate >= '2017-11-01');

如果您想在本月的任何时间进行活动:

SELECT *
FROM MyDataTable
WHERE StartDate < '2017-11-01' AND 
      (EndDate IS NULL OR EndDate > '2017-10-01');

【讨论】:

  • 我虽然更多的是内置日期功能,它只针对年和月部分,但也可以完成这项工作。非常感谢
【解决方案2】:

我认为你可以通过使用 'DATEDIFF ( datepart , startdate , enddate )' 仅使用几个月来实现这一目标:

DECLARE @startDate DATE = '2017-11-01';
DECLARE @numberOfMonth INT;

SELECT @numberOfMonth = datediff(month, @startDate, GETDATE());


SELECT * 
FROM MyDataTable 
WHERE datediff(month, StartDate, GETDATE()) >= @numberOfMonth
AND (EndDate IS NULL OR datediff(month, EndDate, GETDATE()) <= 
@numberOfMonth)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多