我需要在SQL中显示日期列表。我已经有一个单行输入的n数字代码。显示SQL中开始和结束日期的日期列表
当前表结构(日/月/年格式的日期):
Code FromDate ToDate Total Days
1 01/03/2012 04/03/2012 4
2 01/04/2012 05/04/2012 5
我需要输出为:
Code FromDate
1 01/03/2012
1 02/03/2012
1 03/03/2012
1 04/03/2012
我需要在SQL中显示日期列表。我已经有一个单行输入的n数字代码。显示SQL中开始和结束日期的日期列表
当前表结构(日/月/年格式的日期):
Code FromDate ToDate Total Days
1 01/03/2012 04/03/2012 4
2 01/04/2012 05/04/2012 5
我需要输出为:
Code FromDate
1 01/03/2012
1 02/03/2012
1 03/03/2012
1 04/03/2012
WITH date_range (calc_date) AS (
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, '2010-01-13') - DATEDIFF(DAY, '2010-01-01', '2010-01-13'), 0)
UNION ALL SELECT DATEADD(DAY, 1, calc_date)
FROM date_range
WHERE DATEADD(DAY, 1, calc_date) <= '2010-01-13')
SELECT calc_date
FROM date_range;
虽然你推断的可以写代码日期(如VikramJain的recursive CTE SQL Server)它的CPU很重。如果您有大量记录,并且时间跨度很大,那么您将迭代地构建大量数据。每当你查询你的数据时你都会这样做。到目前为止,最高效率的方法就是创建另一个表。
如果您根据维度表和事实表考虑数据库,则开始日期和结束日期只是隐含维度Time
的关键。而不是隐含的,明确的,并创建一个Calendar
表。然后它是微不足道的...
SELECT
yourTable.code,
calendar.calendar_date
FROM
yourTable
INNER JOIN
calendar
ON calendar.calendar_date >= yourTable.fromDate
AND calendar.calendar_date < yourTable.toDate
这可能会节省大量的CPU负载,并大大简化您的查询。
一旦你有了表格,预填充日期涵盖了你将需要的一切,许多杂乱的日期操作变成简单的可索引查找。
你甚至可以添加到该表的元数据,如...
有的人批评这不雅。我个人觉得正好相反:
- 它缓存基于凌乱的日期计算
- 它明确地创建一个维表
它甚至使用Teradata的非常良好的效果:sys_calendar.calendar
。
使用循环或日期查找表,或者只是在前端执行。你做了什么没有奏效? –
你有没有尝试过自己?你使用的是什么数据库引擎?是不是'总天数'是多余的? –
你可以为此写一个程序。 – Suranga