2

私はクエリを練習しており、現在のシナリオは、特定の日付に最も近い土曜日を見つけることです。ロジックを理解した後、長くて厄介なクエリのように見えるものを思いつきました。そして、これを単純化する方法があるかどうか疑問に思っていました。これが私のクエリです

DECLARE @DATE DATE
SET @DATE ='2013-09-13'

IF              DATENAME(DW,@DATE) = 'SUNDAY'
    BEGIN 
        SELECT  DATEADD(DAY,-1,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
    END
ELSE IF         DATENAME(DW,@DATE) = 'MONDAY'
    BEGIN 
        SELECT  DATEADD(DAY,-2,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
    END
ELSE IF         DATENAME(DW,@DATE) = 'TUESDAY'
    BEGIN 
        SELECT  DATEADD(DAY,-3,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
    END
ELSE IF         DATENAME(DW,@DATE) = 'WEDNESDAY'
    BEGIN 
        SELECT  DATEADD(DAY,3,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
    END
ELSE IF         DATENAME(DW,@DATE) = 'THURSDAY'
    BEGIN 
        SELECT  DATEADD(DAY,2,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
    END
ELSE IF         DATENAME(DW,@DATE) = 'FRIDAY'
    BEGIN 
        SELECT  DATEADD(DAY,1,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
    END
ELSE IF         DATENAME(DW,@DATE) = 'SATURDAY'
    BEGIN
        SELECT  CONVERT(NVARCHAR,@DATE) + ' IS SATURDAY' AS DATE_DOW
    END

ご覧のとおり、クエリは長く、複数の IF を実行して TRUE 条件を探します。ヒントだけで、クエリを書かないでください。私は自分でクエリに取り組みたいと思います。

4

3 に答える 3

1

あなたが要求したように、答えずに私のヒントは次のとおりです。

現在の日付を使用して日付操作を検討し(GETDATE()または日付変数を使用できます)、これDATEADD()DATEDIFF()使用して数行で記述できます。

メソッドを単純化したいだけの場合は、次のCASEステートメントを使用できます。

DECLARE @date DATE = '2013-09-13'
SELECT CASE WHEN DATENAME(DW,@DATE) = 'SUNDAY' THEN  CAST(DATEADD(DAY,-3,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'MONDAY' THEN CAST(DATEADD(DAY,-2,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'TUESDAY' THEN CAST(DATEADD(DAY,-1,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'WEDNESDAY' THEN CAST(DATEADD(DAY,1,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'THURSDAY' THEN CAST(DATEADD(DAY,2,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            WHEN DATENAME(DW,@DATE) = 'FRIDAY' THEN CAST(DATEADD(DAY,3,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
            ELSE CONVERT(NVARCHAR,@DATE) + ' IS SATURDAY'
       END

私がほのめかし、Sparky が投稿した方法を明確にするためにDATEFIRST、この作業を行うために調整する必要があります。これは、週の最初の日、土曜日が週の 7 日であっても機能します。

SET DATEFIRST 7
DECLARE @date DATE = '2013-09-21'
SELECT DATEADD(day,7-DATEPART(weekday,@date),@date)
于 2013-09-13T16:45:56.423 に答える
0

正確な答えではありませんが、代替案です

    DECLARE @DATE DATE,
    @SUN DATE,
    @MON DATE,
    @TUE DATE,
    @WED DATE,
    @THU DATE,
    @FRI DATE,
    @SAT DATE

           SET @DATE = '2013-09-14'

    SET @SUN = DATEADD(DAY,-1,@DATE)
    SET @MON = DATEADD(DAY,-1,@DATE)
    SET @TUE = DATEADD(DAY,-2,@DATE)
    SET @WED = DATEADD(DAY,-3,@DATE)
    SET @THU = DATEADD(DAY,2,@DATE)
    SET @FRI = DATEADD(DAY,1,@DATE)
    SET @SAT = DATEADD(DAY,0,@DATE)

    SELECT CASE 
        WHEN DATENAME(DW,@DATE) = 'SUNDAY'
        THEN @SUN
        WHEN DATENAME(DW,@DATE) = 'MONDAY'
        THEN @MON
        WHEN DATENAME(DW,@DATE) = 'TUESDAY'
        THEN @TUE
        WHEN DATENAME(DW,@DATE) = 'WEDNESDAY'
        THEN @WED
        WHEN DATENAME(DW,@DATE) = 'THURSDAY'
        THEN @THU
        WHEN DATENAME(DW,@DATE) = 'FRIDAY'
        THEN @FRI
        ELSE @SAT
    END
于 2013-09-13T17:35:46.413 に答える
0

これを試して:

select dateAdd(dd,7-DATEPART(dw,getDate()),GETDATE())

datePart(dw,...)は、現在の日付の曜日を返します。

7 - その数、土曜日までの日数を返します

結果を日付に追加して、次の土曜日を取得します...

前の土曜日に戻る必要がある場合の同様のロジック

SQL フィドル: http://www.sqlfiddle.com/#!3/61998/2

于 2013-09-13T16:57:55.747 に答える