SQL цикл while со счетчиком даты

Мне нужно сделать что-то вроде этого в sql:

declare @StartDate varchar(10)
declare @EndDate varchar(10)
set @StartDate='12/31/2008'
set @EndDate='1/11/2009'

Declare @date varchar = @StartDate
while (@date <= @EndDate)
begin
 -- some statements
set @date += 1 -- basically increment by 1 day
end

Как я могу сделать это правильно в SQL? По сути, моя начальная и конечная дата являются строками, а не датой и временем, потому что моя бизнес-логика ссылается на строковый столбец в другой таблице с датой в качестве имени столбца. Но мне нужно пройти через кучу столбцов, каждый столбец имеет имя дата следующего дня.

Если дата 07.11.2009, имя столбца будет «7.11.2009» (без 0 в 7), так что я тоже должен следить за этим.

Любая помощь приветствуется!

Спасибо.


person Prabhu    schedule 12.11.2009    source источник
comment
Спасибо за все ваши ответы. Я разместил еще один вопрос конкретно о дате и времени.   -  person Prabhu    schedule 13.11.2009


Ответы (3)


Вы можете преобразовать параметры даты в datetime.

SELECT convert(datetime, @StartDate) into datetimevariable

затем вы можете использовать функции даты, чтобы добавить дни.

select DATEADD(day,1,datetimevariable) into datetimevariable

В качестве решения для получения формата m/d/yyyy я загрузил эту функцию с какого-то веб-сайта пару недель назад. Используйте этот код для создания функции и вызовите ее следующим образом:

 SELECT dbo.fnFormatDate (@DateTimeVariable, 'M/DD/YYYY') into stringVariable 

CREATE FUNCTION dbo.CustomFormatDate (@Datetime DATETIME, @FormatMask VARCHAR(32))
RETURNS VARCHAR(32)
AS
BEGIN

    DECLARE @StringDate VARCHAR(32)
    SET @StringDate = @FormatMask
    IF (CHARINDEX (‘YYYY’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘YYYY’,
                         DATENAME(YY, @Datetime))
    IF (CHARINDEX (‘YY’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘YY’,
                         RIGHT(DATENAME(YY, @Datetime),2))
    IF (CHARINDEX (‘Month’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘Month’,
                         DATENAME(MM, @Datetime))
    IF (CHARINDEX (‘MON’,@StringDate COLLATE SQL_Latin1_General_CP1_CS_AS)>0)
       SET @StringDate = REPLACE(@StringDate, ‘MON’,
                         LEFT(UPPER(DATENAME(MM, @Datetime)),3))
    IF (CHARINDEX (‘Mon’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘Mon’,
                                     LEFT(DATENAME(MM, @Datetime),3))
    IF (CHARINDEX (‘MM’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘MM’,
                  RIGHT(‘0′+CONVERT(VARCHAR,DATEPART(MM, @Datetime)),2))
    IF (CHARINDEX (‘M’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘M’,
                         CONVERT(VARCHAR,DATEPART(MM, @Datetime)))
    IF (CHARINDEX (‘DD’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘DD’,
                         RIGHT(‘0′+DATENAME(DD, @Datetime),2))
    IF (CHARINDEX (‘D’,@StringDate) > 0)
       SET @StringDate = REPLACE(@StringDate, ‘D’,
                                    DATENAME(DD, @Datetime))   

RETURN @StringDate
END
GO
person Jonathan    schedule 12.11.2009
comment
Спасибо. Как преобразовать дату и время в varchar с определенным форматом: объявить @StartDate datetime set @StartDate='07/12/2008' объявить @StartDateString varchar(10) Как установить @StartDateString равным '7/12/2008' Спасибо! - person Prabhu; 13.11.2009
comment
вы можете вызвать преобразование для преобразования даты и времени в строку с третьим параметром. Этот параметр представляет собой целое число, указывающее формат. Пожалуйста, проверьте эту ссылку: msdn.microsoft.com/es-es/library/ms187928 .aspx - person Jonathan; 13.11.2009
comment
Спасибо Джонатан. К сожалению, 101 - ближайший формат мм/дд/гггг, но мне нужен м/д/гггг - person Prabhu; 13.11.2009
comment
Я отредактировал свой ответ, добавив решение для формата m/d/yyyy и других. Если вас интересует производительность, измените функцию, чтобы преобразовать дату только в m/d/yyy. Будет короче. - person Jonathan; 13.11.2009

я бы предпочел, как уже сказал Джонатан, но использовал переменные даты и времени для цикла и добавил день с помощью функции DATEADD. Для доступа к столбцам вы можете использовать оператор CONVERT или CAST, но теперь для получения varchar, например: CAST(@date as varchar(10)). Если требуется специальное форматирование, вы можете создать такую ​​конструкцию, как cast(day(@date) as varchar(2)) + '/' + cast(month(@date) as varchar(2)) + '/' + cast( year(@date) as varchar(4)) это устранит «0», как вы упомянули.

person Ice    schedule 12.11.2009

Используйте DATEADD, затем преобразовать его обратно в строку, используя выбранный формат, например 101 в вашем случае:

set @date = convert(varchar(30), dateadd(day,1, @date), 101);
person Remus Rusanu    schedule 12.11.2009