проблема с инструкцией sql

#sql #sql-server-2005

#sql #sql-server-2005

Вопрос:

В моем запросе я пытаюсь получить вчерашнюю дату и точно такую же дату в выбранном году. Итак, сегодня 08.12.2010

Я хочу, чтобы 07.12.2010 и 07.12.2009

Я забыл упомянуть, что последний пользователь, который создал базу данных, сохранил все забронированные даты как intgers, так что в основном

      Date  Year month booked  time
     28Sep09 2009 09 40084 1159
    07Oct09 2009 10 40093 1221
    08Oct09 2009 10 40094 1025
    16Oct09 2009 10 40102 1058
    02Nov09 2009 11 40119 1708
    05Nov09 2009 11 40122 1213
    13Nov09 2009 11 40130 1502
    24Nov09 2009 11 40141 1004
    24Nov09 2009 11 40141 1030
    16Feb10 2010 02 40225 1150
    16Feb10 2010 02 40225 1158
    08Mar10 2010 03 40245 1249
    05Apr10 2010 04 40273 0937
    24May10 2010 05 40322 1559
    25May10 2010 05 40323 1539
    04Jun10 2010 06 40333 1428
    26Jul10 2010 07 40385 1708
    19Aug10 2010 08 40409 1637
    02Sep10 2010 09 40423 0927
    03Sep10 2010 09 40424 1253
    13Sep10 2010 09 40434 1534
    04Oct10 2010 10 40455 1341
    19Oct10 2010 10 40470 0939
    02Nov10 2010 11 40484 0923
    03Nov10 2010 11 40485 0854
    03Nov10 2010 11 40485 1259
    08Nov10 2010 11 40490 1210
    12Nov10 2010 11 40494 1121
    18Nov10 2010 11 40500 1222
    05Aug10 2010 08 40395 1649
  

мои даты выглядят следующим образом: (

таким образом, это заменило бы мой последний запрос

 Declare @YearToget Integer 
Set @yearToGet = 2008

SELECT TOP (100) PERCENT DIVISION, SDESCR, 
      DYYYY, SUM(APRICE) AS Sales, SUM(PARTY) AS PAX, 
      SUM(NetAmount) AS NetSales, 
      SUM(InsAmount) AS InsSales, 
      SUM(CancelRevenue) AS CXSales, 
      SUM(OtherAmount) AS OtherSales, 
      SUM(CXVALUE) AS CXValue 
FROM  dbo.B101BookingsDetails AS B101BookingsDetails 
WHERE BOOKED <= DateAdd(year, @YearToGet - Year(getdate()), 
                 DateAdd(day, DateDiff(day, 1, getdate()), 0) )
  AND @YearToGet
GROUP BY SDESCR, DYYYY, DIVISION 
HAVING      (DYYYY = @YearToGet) 
ORDER BY DIVISION, SDESCR, DYYYY 
  

Комментарии:

1. Я пытаюсь отфильтровать свои даты, однако они хранятся в виде целых чисел

Ответ №1:

Попробуйте:

 Declare @YearToget Integer 
Set @yearToGet = 2008

  Select DateAdd(year, @YearToGet - Year(getdate()), 
         DateAdd(day, DateDiff(day, 1, getdate()), 0) )
  

В вашем запросе:

    Where Booked = DateAdd(year, 2008- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) )
      Or Booked = DateAdd(year, 2009- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) )
      Or Booked = DateAdd(year, 2010- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) )
      Or Booked = DateAdd(year, 2011- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) )
  

Или

    Where Booked In
      (DateAdd(year, 2008- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) ),
       DateAdd(year, 2009- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) ),
       DateAdd(year, 2010- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) ),
       DateAdd(year, 2011- Year(getdate()), 
             DateAdd(day, DateDiff(day, 1, getdate()), 0) ) )
  

Ваш запрос выше, переписан:

 Declare @YearToget Integer  
Set @yearToGet = 2008  
Select Division, SDESCR,        
    DYYYY, Sum(APRICE) Sales, 
    Sum(PARTY) AS PAX,        
    Sum(NetAmount) NetSales,        
    Sum(InsAmount) InsSales,        
    Sum(CancelRevenue) CXSales,        
    Sum(OtherAmount) OtherSales,        
    Sum(CXVALUE) CXValue  
From dbo.B101BookingsDetails 
Where Booked <= DateAdd(year, @YearToGet - Year(getdate()),                   
                DateAdd(day, DateDiff(day, 1, getdate()), 0) )      
-- AND @YearToGet -- This line appears to be incomplete
Group By SDESCR, DYYYY, Division
Having (DYYYY = @YearToGet)  
Order By Division, SDESCR, DYYYY 
  

Комментарии:

1. как я мог бы реализовать это в моем запросе в инструкции where

2. Просто замените переменную @YearToget параметром запроса и используйте все выражение целиком (без `Select’, как если бы вы использовали имя colun или параметр.

3. проверьте запрос, который я написал сверху, пожалуйста

4. Соответствуют ли целые числа, в которых хранятся ваши даты, внутренним значениям даты SQL server? (получено при запуске DateDiff(day, 0, [SomeDate]) ? Это похоже на это, но тот, который вы перечислили, ( 05Mar07 ) должен быть 39144 , а не 39146 ….

5. да, теперь я не понимаю, почему я ошибся номером, но 05Mar07 — это 39146

Ответ №2:

Вчера

 convert(varchar, getDate()-1, 101)
  

год назад со вчерашнего дня

 convert(varchar, dateadd(year, -1, getDate()-1), 101)
  

Ответ №3:

Пара замечаний. Во-первых, вы не должны использовать «ЛУЧШИЕ 100 ПРОЦЕНТОВ». Это не дает никакой пользы. Если вы пытаетесь использовать это в представлении, вы должны знать, что использование TOP 100 ПРОЦЕНТОВ с ORDER BY не гарантирует порядок при запросе к представлению. Во-вторых, может показаться, что у вас проблема с вашими целочисленными значениями в том, что они отклонены на два дня по сравнению с DateDiff(d,0, <date>) . Я компенсировал это в предложении Where с помощью BD.Booked = N.DateInt - 2 , но вам следует разобраться в причинах, почему это так.

 Declare @YearToGet int
Set @YearToGet = 2008

;With RawData As
    (
    Select 39503 As Booked
    Union All Select 39509
    Union All Select 39535
    Union All Select 39620
    Union All Select 39791
    Union All Select 39838
    Union All Select 39899
    Union All Select 39134
    Union All Select 39139
    Union All Select 39139
    Union All Select 39140
    Union All Select 39146
    Union All Select 39146
    Union All Select 39146
    )
    , Numbers As 
    (
    Select 0 As Value, Year(GetDate()) As [Year]
        , Cast( DateDiff(d,0,GetDate()) as datetime ) As [Date]
        , DateDiff(d,0,GetDate()) As [DateInt]
    Union All 
    Select Value   1, [Year] - 1
        , DateAdd(yyyy, -1, [Date])
        , DateDiff(d, 0, DateAdd(yyyy, -1, [Date]))
    From Numbers
    Where Value <= ( Year(GetDate()) - @YearToGet )
    )
Select DIVISION, SDESCR, DYYYY
    , SUM(APRICE) AS Sales
    , SUM(PARTY) AS PAX
    , SUM(NetAmount) AS NetSales
    , SUM(InsAmount) AS InsSales
    , SUM(CancelRevenue) AS CXSales
    , SUM(OtherAmount) AS OtherSales
    , SUM(CXVALUE) AS CXValue
From dbo.B101BookingsDetails As BD
    Join Numbers As N
        On Cast(N.[Year] As char(4)) = BD.DYYYY
Where BD.Booked = N.DateInt - 2
Group By DIVISION, SDESCR, DYYYY
  

Комментарии:

1. Я думаю, что он хочет выбрать его, а не включать в свое WHERE предложение

2. @Abe Miessler — Возможно, вы правы, хотя в исходном примере это используется в предложении Where (возможно, неправильно), подразумевая, что он пытается отфильтровать результаты. Сложно разобраться без ясности.

3. Кто знает, чего он хочет. Это определенно запутанный вопрос.

4. Сообщение 102, уровень 15, состояние 1, проверка процедуры, строка 53 Некорректный синтаксис рядом с ‘DYYYY’. это сведет меня с ума

5. @MyHeadHurts — Каков тип данных столбца DYYYY ? Это целое число или строка?

Ответ №4:

 select getdate() /* Today */
select dateadd(day, -1, getdate()) /* Yesterday */
select dateadd(year, -1, dateadd(day, -1, getdate())) /* 1 year ago yesterday */