如何按日期过滤列

Posted

技术标签:

【中文标题】如何按日期过滤列【英文标题】:How to filter the column by date 【发布时间】:2012-06-11 05:33:32 【问题描述】:

使用 SQL Server 2000

表1

Id    date 
---   ----------
001   23/01/2012
002   25/01/2012
003 
004   01/02/2012

table1,我想显示id 并且日期为空或日期等于当前月份..

条件

例如当月是02/2012 表示,我要显示id 003 和004,因为003 日期为空,004 日期等于当月日期...

如果当前月份为03/2012,则不应显示004日期

如何在 SQL Server 中执行此操作?

预期输出

Id     date 
003 
004    01/02/2012

【问题讨论】:

【参考方案1】:

重要的是让您的查询 sargable 以便可以使用日期列上的索引。因此,形式为 function(date)(其中 function 是年、月或 datepart)的 where 子句不好,因为 SQL Server 不能使用日期索引。

相反,您希望构建查询以使其具有以下形式

select *
from table1
where (date is null) or (date between [STARTOFMONTH] and [ENDOFMONTH])

DateTime 列,顾名思义,有一个 TIME 组件。因此,介于之间很棘手,因为您希望一直到月底的午夜,但又不完全是下个月的午夜……有些人试图通过从月底减去 3 毫秒来解决这个问题。这很糟糕,而且没有未来的证据。

最好让你的查询看起来像

select *
from table1
where (date is null) or ( (date >= [STARTOFMONTH] and date < [STARTOFNEXTMONTH]) )

如何获取这些值(并与 SQL 2000 兼容...)? 一种方法,在我的脑海中,是

cast(  floor( cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float ) ) as datetime )

下一个月的开始是通过增加一个月来获得的。这将获取当前日期,减去当前月份经过的天数,然后加 1。然后我们有一个日期/时间等于该月的第一天,但​​仍然具有时间分量。转换为浮动、落地然后转换回日期时间可以解决此问题。

这可以放入标量或内联表 UDF,但为了简洁起见(答案已经很长了!),您的 where 子句是

select *
from table1
where 
(date is null)
OR
(
  ( date >= cast(  floor( cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float ) ) as datetime ) )
  AND
  ( date < dateAdd(d, 1, cast(  floor( cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float ) ) as datetime ) ) )
)

希望有帮助!

【讨论】:

要获取每月的第一天,您可以使用dateadd(month, datediff(month, 0, getdate()), 0) 和下个月的第一天dateadd(month, 1+datediff(month, 0, getdate()), 0)【参考方案2】:
Select * 
from table1 
where date is null or datepart(mm,getdate()) = datepart(mm,date)

【讨论】:

如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ( )工具栏以很好地格式化和语法突出显示它!【参考方案3】:

您可以使用 is nullYear , Month 函数进行检查

select  Id
from Table1 
where date is null or (YEAR(GETDATE()) == Year(date) and Month(GETDATE()) == Month(date))

【讨论】:

【参考方案4】:

试试这个方法:-

SELECT *
FROM table1
WHERE date IS NULL OR (Year(currentDate) = Year(date) AND Month(currentDate) = Month(date))

【讨论】:

它是 CURRENT_TIMESTAMP 而不是 currentDate【参考方案5】:
SELECT * FROM Table1 
WHERE (1=1)
AND
(
    MONTH(CURRENT_TIMESTAMP) = MONTH([date])
    AND
    YEAR(CURRENT_TIMESTAMP) = YEAR([date])
)
OR
(
    [date] IS NULL
)

【讨论】:

以上是关于如何按日期过滤列的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL 数据库导入表并按日期过滤行时,将 Pandas 列解析为 Datetime

按 datetime64 中没有日期的时间过滤

根据日期范围过滤列

大熊猫在grouby之后按日期时间过滤

BigQuery过滤器,按日期对分类列的每个值显示最后5行

按用户选择的日期过滤