2

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で上記を正しく行うにはどうすればよいですか? 基本的に、私のビジネスロジックは別のテーブルの文字列列を列の名前として日付で参照しているため、開始日と終了日は文字列であり、日時ではありません。しかし、列の束をループする必要があり、各列は翌日の日付。

日付が 11/07/2009 の場合、列の名前は '11/7/2009' (7 の 0 なし) になるため、これにも注意する必要があります。

どんな助けでも大歓迎です!

ありがとう。

4

4 に答える 4

5

日付パラメーターを日時に変換できます。

SELECT convert(datetime, @StartDate) into datetimevariable

その後、日付関数を使用して日を追加できます。

select DATEADD(day,1,datetimevariable) into datetimevariable

am/d/yyyy 形式を取得するための解決策として、数週間前にある Web サイトからこの関数を C&P しました。このコードを使用して関数を作成し、次の方法で呼び出します。

 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
于 2009-11-12T21:07:19.840 に答える
1

DATEADDを使用してから、選択した形式を使用して文字列にキャストし直します。たとえば、この場合は 101 です。

set @date = convert(varchar(30), dateadd(day,1, @date), 101);
于 2009-11-12T21:10:45.763 に答える
1

私はジョナサンがすでに言ったような方法を好みますが、ループに日時変数を使用し、DATEADD 関数で日を追加します。列にアクセスするには、CONVERT または CAST ステートメントを使用できますが、現在は CAST(@date as varchar(10)) のように varchar を取得しています。特別なフォーマットが必要な場合は、cast(day(@date) as varchar(2)) + '/' + cast(month(@date) as varchar(2)) + '/' + cast( のような構造を構築できます。 year(@date) as varchar(4)) これは、あなたが言及したように「0」を排除します。

于 2009-11-12T21:18:59.787 に答える