提取日期等于今天减去一个或多个季度的数据行

时间:2012-12-05 12:57:54

标签: sql sql-server

我有一个日期范围(SQL服务器),如下所示:

UserID, Date
4582, 2012-09-04
4665, 2012-09-05
1251, 2012-06-05
6538, 2011-08-04
7485, 2011-09-05

我需要提取日期等于今天减去一个或多个季度的数据(例如今天减去1个季度,今天减去2个季度等)

在这种情况下,应返回的数据是:

UserID, Date
4665, 2012-09-05
1251, 2012-06-05
7485, 2011-09-05

我可以使用datediff(quarter,date,getdate())创建此查询,还是需要执行不同的操作?

4 个答案:

答案 0 :(得分:1)

datediff(quarter,date,getdate())返回日期是否在不同的季度,而不是它们是否恰好相隔四分之一,我认为这是您正在寻找的。

所以我希望找到3个月之前的日期,并且也是在该月的同一天。

SQL Fiddle

MS SQL Server 2008架构设置

CREATE TABLE tableA
    ([UserID] int, [Date] date);

INSERT INTO tablea
    ([UserID], [Date])
VALUES
    (4582, '2012-09-04'),
    (4665, '2012-09-05'),
    (1251, '2012-06-05'),
    (6538, '2011-08-04'),
    (7485, '2011-09-05');

查询1

SELECT *
FROM TableA
WHERE
    -- Only get dates which are a multiple of 3 months previosuly
    DATEDIFF(mm, [DATE], GETDATE()) % 3 = 0
    -- only get dates that fall on the same day of the month
    AND DAY(GETDATE()) = DAY([Date])

<强> Results

| USERID |       DATE |
-----------------------
|   4665 | 2012-09-05 |
|   1251 | 2012-06-05 |
|   7485 | 2011-09-05 |

答案 1 :(得分:0)

试试这个::

Select 
userID, 
`date_column`

from 
table
where `date_column`> DATE_SUB(CURDATE, INTERVAL 3 MONTH)

答案 2 :(得分:0)

Select 
userID, 
`date_column`

from 
table
where DATEDIFF(CURDATE(),date('date_col')) >= 90

答案 3 :(得分:0)

由于您使用的是SQL Server,因此您可以使用递归查询创建一个日期列表,该查询与今天的值减去一个季度相等,然后得到您的最终列表:

;with dates (value) as
(
  select cast(getdate() as date)
  union all
  select dateadd(quarter, -1, value)
  from dates
  where dateadd(quarter, -1, value) >= '2010-01-01'
)
select userid, date
from yourtable t
inner join dates d
  on t.date = d.value

请参阅SQL Fiddle Demo

结果:

| USERID |       DATE |
-----------------------
|   4665 | 2012-09-05 |
|   1251 | 2012-06-05 |
|   7485 | 2011-09-05 |