Разделить диапазон дат в одну строку в месяц на сервере sql

У меня есть таблица с двумя столбцами, называемыми «from_date» и «to_date»,

the table look like:- 

введите описание изображения здесь

Я хочу получить результат: –

 from_date to_date ----------- ------------ 2013-11-25 2013-11-30 2013-12-01 2013-12-05 

Эта дата делится с 2013-11-25 по 2013-11-30, а другая дата делится с 2013-12-01 по 2013-12-05 … Разве можно разбить это?

Это год високосного года и обрабатывает диапазоны дат, которые другие ответы в настоящее время нет.

 DECLARE @d TABLE(from_date DATE, to_date DATE); INSERT @d VALUES ('2013-11-25','2013-12-05'); ;WITH n(n) AS ( SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 FROM sys.all_columns ), d(n,f,t,md,bp,ep) AS ( SELECT nn, d.from_date, d.to_date, DATEDIFF(MONTH, d.from_date, d.to_date), DATEADD(MONTH, nn, DATEADD(DAY, 1-DAY(from_date), from_date)), DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, nn, DATEADD(DAY, 1-DAY(from_date), from_date)))) FROM n INNER JOIN @d AS d ON d.to_date >= DATEADD(MONTH, nn-1, d.from_date) ) SELECT original_from_date = f, original_to_date = t, new_from_date = CASE n WHEN 0 THEN f ELSE bp END, new_to_date = CASE n WHEN md THEN t ELSE ep END FROM d WHERE md >= n ORDER BY original_from_date, new_from_date; 

Результаты:

 original_from_date original_to_date new_from_date new_to_date ------------------ ---------------- ------------- ----------- 2013-11-25 2013-12-05 2013-11-25 2013-11-30 2013-11-25 2013-12-05 2013-12-01 2013-12-05 

Демоверсия SQLFiddle с более длинными диапазонами дат и високосными годами

Если вы работаете в хранилище пространственных данных, используйте измерение даты. В противном случае используйте CTE.

 WITH cte AS (SELECT from_date , to_date , from_date AS mo_from_date , DATEADD(day, day(from_date)* -1 + 1, from_date) AS bom_date FROM DateTable UNION ALL SELECT from_date , to_date , DATEADD(month,1,bom_date) , DATEADD(month,1,bom_date) FROM cte where DATEADD(month,1,mo_from_date) < to_date ) SELECT mo_from_date , CASE when to_date < DATEADD(month,1,bom_date) THEN to_date ELSE DATEADD(day, -1, DATEADD(month,1,bom_date)) END AS mo_to_date FROM cte 
Interesting Posts

SQLServer не может найти функцию, определенную пользователем, в хранимой процедуре

Очередь приоритетов в SQL Server

Как проверить, имеет ли список какое-либо другое значение

Удалить только после десятичного SQL-сервера 2012

Что лучше: ограничение или FK? Для столбца состояния

SQL Server INSERT в огромную таблицу медленный

Создание программной программы SQL Server Trace?

Разница между двумя строками с датой в порядке возрастания

Получить данные для каждого идентификатора в родительской / дочерней базе данных в tSQL

Проверьте, возвращает ли SELECT любые строки в хранимой процедуре

восстановление базы данных

Любой инструмент для проверки хранимых запросов SQL Server, когда данные недоступны в базе данных.

Ошибка таймаута в командлете Backup-SQLDatabase

Удаление таблицы __MigrationHistory из базы данных

Объявить переменную с помощью инструкции SELECT SQL, которая будет использоваться в предложении WHERE

Давайте будем гением компьютера.