#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 */