Условные параметры даты SQL для пропуска выходных дней - PullRequest
0 голосов
/ 23 мая 2018

Впервые в SQL, и я полностью потерян на этом.Попытка написать запрос, чтобы вытащить новые учетные записи, открытые в предыдущий день, что может быть легко для вторника-пятницы.Но по понедельникам наступает воскресенье, и все, что я пытался сделать, ошибалось.

Это самое близкое, что я пришел, но оно все еще не верно в последней строке.Я думаю, что я пытаюсь применить Excel VBA тип логики, и мне просто не нравится.Может кто-нибудь, пожалуйста, взгляните на это?

Спасибо!

SELECT
    PortfolioCode as "Account", 
    f.reportheading1 as "Name", 
    d.portfoliostatus as "Status", 
    e.investmentstrategy as "Strategy",
    e.brokersource as "Broker", 
    e.referringfirm as "RefBy", 
    e.custodian as "Bank",
    e.manager as "Manager", 
    e.administrator as "APM", 
    d.initialvalue as "Open Value", 
    b.StartDate as "Start Date", 
    e.percentcash as "Cash%", 
    e.targetmvequity as "Eqt Trgt", 
    e.targetmvfixed as "FI Trgt", 
    e.munistrategy as "Muni Strat", 
    e.nationalmuni as "Nat. Muni", 
    e.statemunistrategy as "State Strat.", 
    e.residency as "Residency"
FROM
    AdvPortfolioBaseExt as A
INNER JOIN
    AdvPortfoliobase AS B ON A.PortfolioBaseID = b.PortfolioBaseID
INNER JOIN
    advportfolio AS C ON A.PortfolioBaseID = c.PortfolioID
INNER JOIN
    advapp.vportfolio AS D ON A.PortfolioBaseID = D.PortfolioID
INNER JOIN
    advportfoliobaseext AS E ON A.portfoliobaseid = e.portfoliobaseID
INNER JOIN
    advapp.vportfoliobase AS F ON a.PortfolioBaseID = f.PortfolioBaseID
WHERE 
    c.portfoliostatus <> 'Closed'
    AND IIF(DATEPART(dw, GETDATE()) = 2, b.startdate > GETDATE() - 3, b.startdate > GETDATE()-1)

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Это может быть излишним, но вы можете параметризовать запрос и передать значение даты.В противном случае я просто сделал бы простой CTE и установил бы переменную datetime, которая будет использоваться для условия where.SQL ниже предназначен для 2005 года (более новые версии имеют разные функции).Я не был уверен, какую версию вы используете, поэтому я выбрал наименьший общий знаменатель.В любом случае это должно работать, и если есть проиндексированные поля, на них не будет влиять вычисляемое условие в предложении WHERE, которое вы пытаетесь.

DECLARE @Date DATETIME;

;WITH WeekDayOffset AS (
    SELECT 1 as WkDay, -2 as OffSet 
    UNION ALL 
    SELECT 2 as WkDay, 0 as OffSet 
    UNION ALL 
    SELECT 3 as WkDay, 0 as OffSet 
    UNION ALL 
    SELECT 4 as WkDay, 0 as OffSet 
    UNION ALL 
    SELECT 5 as WkDay, 0 as OffSet 
    UNION ALL 
    SELECT 6 as WkDay, 0 as OffSet 
    UNION ALL 
    SELECT 7 as WkDay, -1 as Offset
)

SELECT  @Date = CAST(CONVERT(VARCHAR(10), DATEADD(DAY, Offset, GETDATE()),101) AS datetime)
FROM WeekDayOffset
WHERE WkDay = DATEPART(dw, GETDATE())


SELECT
    PortfolioCode as "Account", 
    f.reportheading1 as "Name", 
    d.portfoliostatus as "Status", 
    e.investmentstrategy as "Strategy",
    e.brokersource as "Broker", 
    e.referringfirm as "RefBy", 
    e.custodian as "Bank",
    e.manager as "Manager", 
    e.administrator as "APM", 
    d.initialvalue as "Open Value", 
    b.StartDate as "Start Date", 
    e.percentcash as "Cash%", 
    e.targetmvequity as "Eqt Trgt", 
    e.targetmvfixed as "FI Trgt", 
    e.munistrategy as "Muni Strat", 
    e.nationalmuni as "Nat. Muni", 
    e.statemunistrategy as "State Strat.", 
    e.residency as "Residency"
FROM
    AdvPortfolioBaseExt as A
INNER JOIN
    AdvPortfoliobase AS B ON A.PortfolioBaseID = b.PortfolioBaseID
INNER JOIN
    advportfolio AS C ON A.PortfolioBaseID = c.PortfolioID
INNER JOIN
    advapp.vportfolio AS D ON A.PortfolioBaseID = D.PortfolioID
INNER JOIN
    advportfoliobaseext AS E ON A.portfoliobaseid = e.portfoliobaseID
INNER JOIN
    advapp.vportfoliobase AS F ON a.PortfolioBaseID = f.PortfolioBaseID
WHERE 
    c.portfoliostatus <> 'Closed'
    AND b.startdate > @Date
0 голосов
/ 23 мая 2018

DATEPART(dw) зависит от значения настройки сервера DATEFIRST.Итак, я избегаю этого ...

WHERE
    b.startdate
    >=
    getdate() - CASE DATENAME(dw, getdate()) WHEN 'Sunday' THEN 2
                                             WHEN 'Monday' THEN 3
                                                           ELSE 1 END

Кроме того, ваши ошибки в том, что возвращаемые значения из IIF() не могут быть результатами логических сравнений.Он должен возвращать скалярное значение типа, существующего в SQL Server (который не имеет логического типа)

Это допустимое ...

WHERE s.startdate >= IIF(x = y, a, b)

Это недействительно ...

WHERE IIF(x = y, s.startdate >= a, s.startdate >= b)

Итак, то, что вы написали, могло быть ...

WHERE
  s.startDate > IIF(datepart(dw,getdate()) = 2, getdate()-3, getdate()-1)

Хотя, это неправильно, если выполнено в воскресенье ...

...