2009-11-12 99 views
2

我需要做的SQL是这样的:SQL while循环与日期计算器

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?基本上,我的startdate和enddate是字符串,而不是日期时间,因为我的业务逻辑引用了另一个表中的字符串列,其中的日期是列的名称 - 但是我需要遍历一堆列,每列都有名称第二天的日期。

如果日期为2009年7月11日,该列的名称将为'11/7/2009'(7中不包含0),所以我也必须小心。

任何帮助表示赞赏!

谢谢。

+0

感谢您的答案。我特别针对日期时间发布了另一个问题。 – Prabhu 2009-11-12 21:26:07

回答

5

您可以将日期参数转换为日期时间。

SELECT convert(datetime, @StartDate) into datetimevariable 

然后你可以使用日期函数来添加天。

select DATEADD(day,1,datetimevariable) into datetimevariable 

作为解决获得M/d/yyyy格式,I C & P从一些网站这个功能的几个星期前。使用所选择的格式,像你的情况101

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 
+0

谢谢。如何从时间值转换与特定的格式为varchar: 声明@StartDate日期时间 集@起始日期= '12/07/2008' 声明@StartDateString VARCHAR(10) 如何设置@StartDateString等于' 12/7/2008' 谢谢! – Prabhu 2009-11-12 21:11:04

+0

你可以调用转换从日期时间转换为字符串与第三个参数。这个参数是一个告诉格式的int。请检查此链接:http://msdn.microsoft.com/es-es/library/ms187928.aspx – Jonathan 2009-11-12 21:15:34

+0

谢谢乔纳森。不幸的是,101是最接近的格式\t mm/dd/yyyy,但我需要m/d/yyyy – Prabhu 2009-11-12 21:27:48

1

使用DATEADD,然后cast回一个字符串::使用此代码创建一个函数并调用这样

set @date = convert(varchar(30), dateadd(day,1, @date), 101); 
1

我会喜欢乔纳森allready说的方式,但使用日期时间变量的循环,并添加一天的DATEADD函数。要访问列,您可以使用CONVERT或CAST语句,但现在可以获取varchar例如CAST(@date as varchar(10))。如果需要特殊的格式,你可以建立像cast(day(@date)as varchar(2))+'/'+ cast(month(@date)as varchar(2))这样的结构+'/'+ cast年(@date)作为varchar(4))这将消除'0',如你所说。