【问题标题】:Apply filter to future dates in sql将过滤器应用于sql中的未来日期
【发布时间】:2012-03-12 04:29:47
【问题描述】:

我有一列这样的日期

1. 01-Mar-2012
2. 01-Apr-2012
3. 01-May-2012
4. 01-Jun-2012
5. 01-Jul-2012
6. 01-Aug-2012
7. 01-Sep-2012
8. 01-Oct-2012
9. 01-Nov-2012
10. 01-Dec-2012
11. 01-Jan-2013
12. 01-Mar-2013
13. 01-Apr-2013
14. 01-May-2013
15. 01-Jun-2013
16. 01-Jul-2013
17. 01-Aug-2013
18. 01-Sep-2013
19. 01-Oct-2013
20. 01-Nov-2013
21. 01-Dec-2013

我只是想对数据应用过滤器,以便记录在 2013 年的某个月份(现在说是四月)停止。

我尝试了以下,但想不出最后一部分:

WHERE DATEPART(year, Q.TermDate) <= DATEPART(year, DATEADD(YEAR, 1, GETDATE())) 
AND DATEPART(MONTH, Q.TermDate) <= ...)

谁能给个建议?

【问题讨论】:

  • 听起来 OP 想要将一个月作为参数,并将逻辑基于该整数。

标签: sql sql-server tsql date filter


【解决方案1】:

假设年份和月份参数:

DECLARE @siYear smallint
DECLARE @tiMonth tinyint
SET @siYear = 2013
SET @tiMonth = 4

SELECT
  MyTable.MyDateValue
FROM
  MyTable
WHERE
  MyTable.MyDateValue <= CAST(RIGHT('0000' + CAST(@siYear AS varchar(4)), 4) + '-' + RIGHT('00' + CAST(@tiMonth AS varchar(2)), 2) + '-01' AS datetime)

对于我认为

WHERE
      MyTable.MyDateValue < DATEADD(day, 1, CAST(RIGHT('0000' + CAST(@siYear AS varchar(4)), 4) + '-' + RIGHT('00' + CAST(@tiMonth AS varchar(2)), 2) + '-01' AS datetime))

【讨论】:

  • 只需稍作修改就可以满足我的需要。再次感谢。 Q.TermDate
【解决方案2】:

相当直截了当;

SELECT * FROM Q WHERE TermDate<'2013-04-01';

演示here.

【讨论】:

    【解决方案3】:

    你可以这样写你的陈述:

    WHERE CONVERT(VARCHAR(6),TermDate,112) <= '201304'
    

    但这不会使用您在TermDate 列上可能拥有的任何索引。所以你可以这样做:

    WHERE TermDate < '20130501'
    

    【讨论】:

      【解决方案4】:

      如果这些已经是日期时间,那么只需使用

      SELECT * FROM TABLE WHERE TermDate <= '01-Apr-2013'
      

      【讨论】:

      • 这不是甲骨文。让我们尝试使用 ISO-8601。 WHERE TermDate
      • 我只是坚持这个例子,但是是的,日期应该以更标准的方式书写。不过,系统应该能够以任何一种方式解释它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2013-04-17
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      相关资源
      最近更新 更多