【问题标题】:CTE Query for DateCTE 查询日期
【发布时间】:2015-01-29 18:59:34
【问题描述】:

我有以下数据:

Create Table #Temp
(
CallDate DateTime
)

Insert into #Temp
Select '2015-01-01'
Union
Select '2015-01-02'
Union
Select '2015-01-03'
Union
Select '2015-01-04'
Union
Select '2015-01-06'
Union
Select '2015-01-08'
Union
Select '2015-01-09'
Union
Select '2015-01-15'

我想要的是日期范围:

FromDate    ToDate
2015-01-01  2015-01-04
2015-01-06  2015-01-06
2015-01-08  2015-01-09
2015-01-15  2015-01-15

【问题讨论】:

标签: sql sql-server tsql common-table-expression


【解决方案1】:

PostgreSQL 语法,因为我现在没有办法在 SQL Server 上进行测试。原理很简单。日期减去 row_number() 的值是连续日期的常数。您可以对常量进行分组。

with grouped_dates as (
  select call_date,
         (call_date - (row_number() over (order by call_date) || ' days')::interval)::date as group_date
  from temp
)
select min(call_date) as from_date, max(call_date) as to_date
from grouped_dates
group by group_date
order by min(call_date);
从日期到日期 -- 2015-01-01 2015-01-04 2015-01-06 2015-01-06 2015-01-08 2015-01-09 2015-01-15 2015-01-15

【讨论】:

  • 我知道 SQLFiddle。我无法连接到 SQL Server 实例。
【解决方案2】:

如果你有一个数字表,你可以做这样的事情(每个范围都有一个联合),虽然这很混乱。

SELECT dateadd(day, number-1, '2015-01-01') as FinalDate
FROM numbers
WHERE number <= datediff(day, '2015-01-01', '2015-01-04') + 1

更好的选择可能是 UDF(参见此处:https://stackoverflow.com/a/1378788/1324019

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2014-08-13
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多