2009-11-12 89 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',如你所說。