2013-11-12 4 views
-3

Я хотел создать диапазоны datetime в SQL Server 2000. Я хочу что-то, что будет совместимо с 2000, 2005 и 2008 годами. Если это будет совместимо с 2012 годом, это тоже будет здорово.Нужна помощь в изменении моего кода SQL

Итак, я нашел ответ здесь - Generate Dates between date ranges. Но я хочу два столбца вместо 1. Я хочу, чтобы столбец даты начала и столбец даты окончания. Как изменить запрос ниже, чтобы получить его?

-- Declarations 

DECLARE @dates TABLE(dt datetime)  
DECLARE @dateFrom datetime 
DECLARE @dateTo datetime 

SET @dateFrom = '2001/01/01' 
SET @dateTo = '2001/01/12' 

-- Query: 

WHILE(@dateFrom < @dateTo) 
BEGIN 
    SELECT @dateFrom = DATEADD(day, 1,@dateFrom) 
    INSERT INTO @dates 
    SELECT @dateFrom 
END 

-- Output 

SELECT * FROM @dates 

Мой код -

DECLARE @dates TABLE(StartDate datetime, EndDate datetime)  
DECLARE @dateFrom datetime 
DECLARE @dateTo datetime 
DECLARE @StartDate datetime 
DECLARE @EndDate datetime 

SET @dateFrom = '2001/01/01' 
SET @dateTo = '2001/01/12' 

WHILE(@dateFrom < @dateTo) 
BEGIN 
    SELECT @dateFrom, @dateFrom = DATEADD(day, 1,@dateFrom) 
    INSERT INTO @dates 
    SELECT @dateFrom 
END 

SELECT * FROM @dates 

Ошибка - оператор SELECT заявление, которое присваивает значение переменной не должно быть объединено с операциями данными поиска.

+0

1) добавить столбец '@ dates' 2) изменить' INSERT' заявление. На какую часть вы застряли? –

+2

гораздо проще сделать это, используя таблицу чисел, и она будет свободной от цикла. –

+0

Можете ли вы предоставить некоторые примеры данных, чтобы уточнить, что вы подразумеваете под ... «Я хочу два столбца вместо 1» – RThomas

ответ

5

Вот на основе множества решений, которые использует spt_values, системную таблицу найденную во всех версиях SQL Server с 2000 -> 2014. В 2000, это будет ограничено диапазоном дат 256 дней. В более современных версиях этот верхний предел будет 2048.

Как правило, решение на основе набора будет работать лучше, чем любой тип цикла WHILE.

DECLARE @start DATETIME, @end DATETIME; 

SELECT @start = '20010101', @end = '20010112'; 

-- INSERT @dates(StartDate, EndDate) 
SELECT 
    StartDate = DATEADD(DAY, number, @start), 
    EndDate = DATEADD(DAY, number+1, @start) 
FROM master..spt_values 
WHERE [type] = 'p' 
AND number < DATEDIFF(DAY, @start, @end); 

Тем не менее, и особенно с учетом 256-дневного ограничения, вы должны просто рассмотреть цифры и/или календарную таблицу ваших собственных, чтобы обойти это ограничение:

http://www.sqlperformance.com/generate-a-set-1

http://www.sqlperformance.com/generate-a-set-2

http://www.sqlperformance.com/generate-a-set-3

Таким образом, вы можете создать его, используя следующий код (при условии, что что 100 000 дней - достаточно большой диапазон для вас):

SELECT TOP 100000 Number = IDENTITY(INT,1,1) 
INTO dbo.Numbers 
FROM sysobjects AS s1 
CROSS JOIN sysobjects AS s2 
ORDER BY 1; 

CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers(Number); 

Вышеупомянутое заняло 4,2 секунды на моей системе 2000 года. С этой таблицей, созданной, запрос становится еще проще (и гораздо менее ограничительным):

DECLARE @start DATETIME, @end DATETIME; 

SELECT @start = '20010101', @end = '20010112'; 

-- INSERT @Dates(StartDate, EndDate) 
SELECT 
    StartDate = DATEADD(DAY, Number-1, @start), 
    EndDate = DATEADD(DAY, Number, @start) 
FROM dbo.Numbers 
WHERE Number <= DATEDIFF(DAY, @start, @end); 
+0

будут ли какие-либо ограничения для этого метода? – Hydra

+1

@ Хидра да, в 2000 году (вы действительно все еще используете 2000?), Он будет ограничен 256 днями. В противном случае, я так не думаю, может быть, вы можете быть более конкретным ... –

+0

Aaron - У меня нет выбора, кроме как использовать 2000. – Hydra

-4
-- Declarations 

DECLARE @dates TABLE(dt datetime, dt2 datetime)  
DECLARE @dateFrom datetime 
DECLARE @dateTo datetime 
DECLARE @endDate datetime 

SET @dateFrom = '2001/01/01' 
SET @dateTo = '2001/01/12' 

-- Query: 

WHILE(@dateFrom < @dateTo) 
BEGIN 
    SELECT @dateFrom = DATEADD(day, 1,@dateFrom) 
    SELECT @endDate = DATEADD(day, 1,@dateFrom) 
    INSERT INTO @dates 
    SELECT @dateFrom, @endDate 
END 

-- Output 

SELECT * FROM @dates 
+1

петля не нужна в таком тривиальном запросе. –

+0

@KM. - Будут ли такие ограничения, как ограничение на 256 дней в SQL Server 2000? – Hydra

+1

@Hydra, я бы ** никогда не использовал ** этот циклный код, ** никогда не был когда-либо. ** –

0

это использует номера таблицы:

DECLARE @dateFrom datetime, @dateTo datetime 

SELECT @dateFrom = '2001/01/01' 
     ,@dateTo = '2001/01/12' 

select 
    @dateFrom+Number-1 
    From Numbers 
    WHERE Number<=datediff(day,@dateFrom,@dateTo+1) 

ВЫВОД:

----------------------- 
2001-01-01 00:00:00.000 
2001-01-02 00:00:00.000 
2001-01-03 00:00:00.000 
2001-01-04 00:00:00.000 
2001-01-05 00:00:00.000 
2001-01-06 00:00:00.000 
2001-01-07 00:00:00.000 
2001-01-08 00:00:00.000 
2001-01-09 00:00:00.000 
2001-01-10 00:00:00.000 
2001-01-11 00:00:00.000 
2001-01-12 00:00:00.000 

(12 row(s) affected) 

Я не уверен, что "2" столбцы ОП хочет, но легко в запросе:

select 
    @dateFrom+Number-1,@dateFrom+Number 
    From Numbers 
    WHERE Number<=datediff(day,@dateFrom,@dateTo) 

OUTPUT:

----------------------- ----------------------- 
2001-01-01 00:00:00.000 2001-01-02 00:00:00.000 
2001-01-02 00:00:00.000 2001-01-03 00:00:00.000 
2001-01-03 00:00:00.000 2001-01-04 00:00:00.000 
2001-01-04 00:00:00.000 2001-01-05 00:00:00.000 
2001-01-05 00:00:00.000 2001-01-06 00:00:00.000 
2001-01-06 00:00:00.000 2001-01-07 00:00:00.000 
2001-01-07 00:00:00.000 2001-01-08 00:00:00.000 
2001-01-08 00:00:00.000 2001-01-09 00:00:00.000 
2001-01-09 00:00:00.000 2001-01-10 00:00:00.000 
2001-01-10 00:00:00.000 2001-01-11 00:00:00.000 
2001-01-11 00:00:00.000 2001-01-12 00:00:00.000 

, если вам нужно создать таблицу чисел, см: What is the best way to create and populate a numbers table?

+0

ошибка - Msg 208, уровень 16, состояние 1, строка 10 Недопустимое имя объекта «Числа». – Hydra

+1

@Hydra вам нужно создать и заполнить таблицу чисел. См. Ссылки в моем ответе. –

+0

@ Хидра, см. Ссылку внизу моего ответа. Он покажет вам, как создать таблицу «Числа». это позволит вам иметь больший диапазон дат, чем использовать 'master..spt_values' –

Смежные вопросы