如何按日期过滤列
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 null 和 Year , 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
)
【讨论】:
以上是关于如何按日期过滤列的主要内容,如果未能解决你的问题,请参考以下文章