0

日なしで2つの日付の間のデータを選択したい

入力例:

開始月: 9 、開始年: 2011
終了月: 3、終了年: 2012

これには2つの方法があると思います。

1 つ目は、開始月と開始年を日付2011-09-01に変換し、最終日を に変換します2012-03-31が、これには終了月の最終日の計算が必要です。これらの日付を取得したら、WHERE 句に BEETWEN 関数を使用できます (ただし、CONVERT 関数は信頼できますか?)

DATEPART2 番目の解決策は、次のコードのように関数を使用することです。

説明しようとします。終了年が最初の年と等しい場合、月は開始月と終了月の間にある必要があります。そうでなければ、最後の月が最初の年よりも大きい場合、最初の年と最後の年が異なる場合は、その間のすべてを取ります。それ以外の場合、最終年、月は最終月以下でなければなりません。最初の年、月は最終月以上でなければなりません。

これを最善の方法で行うのを手伝ってもらえますか? 私が採用した解決策は正しいですか?

declare @IndDebitoCredito bit,@ProgTributo int,@mi as integer,@ai as integer,@mf as integer,@af as integer,@IDAnagrafica varchar(5)
select @mi = 01,@ai = 2011,@mf = 12,@af = 2011,@IDAnagrafica = 'DELEL',@IndDebitoCredito = 1
select distinct rrd.IDTributo
    from TBWH_Delega d
    --inner join TBWH_SezioneDelega sd on d.IDDelega = sd.IDDelega
    inner join TBWH_Rigo rd on rd.IDDelega = d.IDDelega
    inner join TBWH_RataRigo rrd on rrd.IDRigo = rd.IDRigo 
    where
    (
        DATEPART(MM,d.DataDelega)<=@mf and 
        DATEPART(MM,d.DataDelega)>=@mi and 
        DATEPART(YYYY,d.DataDelega)=@ai and 
        @af = @ai
    ) 
    OR
    (
        --anno finale magg. anno iniziale
        @af > @ai AND
        ( 
            (   -- delega nell'intervallo
                DATEPART(YYYY,d.DataDelega)<@af AND 
                DATEPART(YYYY,d.DataDelega)>@ai
                -- DATEPART(MM,d.DataDelega)>=@mi 
            )
            OR
            (   -- delega limite destro
                DATEPART(YYYY,d.DataDelega)=@af AND 
                DATEPART(MM,d.DataDelega)<=@mf 
            )
            OR
            (   -- delega limite sinistro
                DATEPART(YYYY,d.DataDelega)=@ai AND 
                DATEPART(MM,d.DataDelega)>=@mi 
            )
        )
    )

行く

4

5 に答える 5

2

最初の解決策はほとんどありますが、必要以上に複雑で、とにかくうまくいきません。月末の最終日以降の行が失われます。

に 1 か月追加してから、毎月 1 日にend monthBETWEEN を使用できます。例えば。

start month: 9 , start year: 2011 end month: 3, end year: 2012

BETWEEN '2011-09-01' AND '2012-04-01'

または、JNKが指摘しているように、これはより良いでしょう:

DataDelega >= '2011-09-01' AND DataDelega < '2012-04-01'

12 月であることを処理するロジックを追加する必要がありますがend month、これが最も簡単な方法のようです。

于 2011-10-27T14:29:04.250 に答える
0
SELECT *
  FROM Table
 WHERE DateField
       BETWEEN CONVERT(DATE, CONVERT(CHAR(4), @ai) + RIGHT('00' + CONVERT(VARCHAR(2), @mi), 2) + '01', 112)
           AND DATEADD(DD, -1, DATEADD(MM, 1, CONVERT(DATE, CONVERT(CHAR(4), @af) + RIGHT('00' + CONVERT(VARCHAR(2), @mf), 2) + '01', 112)))

クエリがSARGableではなくなるため、DateField 列で式を使用しないでください。

于 2011-10-27T14:27:50.313 に答える
0

私は使うだろう:

WHERE DateToCheck >=               --- first day of StartMonth
          DATEADD( mm, @StartMonth-1,
                   DATEADD( yy, @StartYear-2000, '2000-01-01') 
                 )
  AND DateToCheck <                --- first day of next month (after EndMonth)
          DATEADD( mm, @EndMonth,
                   DATEADD( yy, @EndYear-2000, '2000-01-01') 
                 )
于 2011-10-27T16:04:34.727 に答える
0
DECLARE @mi INT
  , @ai INT
  , @mf INT
  , @af INT
SELECT  @mi = 01
      , @ai = 2011
      , @mf = 12
      , @af = 2011

--local variables to hold dates
DECLARE @i DATETIME
  , @f DATETIME

--build strings to represent dates in YYYYMMDD format
--add a month to the @f date
SELECT  @i = CONVERT(VARCHAR(4), @ai) + RIGHT('0' + CONVERT(VARCHAR(2), @mi),
                                              2) + '01'
      , @f = DATEADD(month, 1,
                     CONVERT(VARCHAR(4), @af) + RIGHT('0'
                                                      + CONVERT(VARCHAR(2), @mf),
                                                      2) + '01')

--select data where date >= @i, and < @f
SELECT  *
FROM    MyTable
WHERE   DateField >= @i
        AND DateField < @f 
于 2011-10-27T16:05:15.393 に答える