2016-05-11 31 views
0

ich ein Problem mit einer Abfrage haben .... Ich habe eine diese Abfrage:SQL - Tag der Woche Ausgabe auf ausgewählten

declare @today int 
set @today=DATEPART(dw,GETDATE())-2 
select cast (cfv.value as VARCHAR), cfv.companyId 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 
/*and cfv.value like '%' + cast (@today as VARCHAR) + '%' */ 

Diese geben mir als eine Tabelle wie die zur Folge haben: Unique Account of a company, Delivery Days

CM001 | 2,4,1
CD04 | 3,3,4
CS7 | 2
CR001 | 4
FG076 | 3,3,5,4 JUH768 | 2,2,2
HG006 | 2
KG040 | 3,2,5

In ein paar Worten spare ich nur @today den Wert des tatsächlichen Wochentages (-2 weil das System, das diese DB verwendet, die Tage auf eine andere Weise verwalten) und dann Ich wähle einfach die Firmendaten und die Liefertage aus zwei verschiedenen Tabellen aus.

Mein Problem ist, dass ich nur das Unternehmen auswählen müssen, die als letzten Liefertag heute hat .... also wenn heute 2 Tage I Unternehmen mit letzten Liefertag 1,2 hat - 0,2 - 0,1 , 2 etc ...

wenn Sie in meinem Code sehen, dass es die letzte Zeile kommentiert, wenn Sie diese Zeile hinzufügen, die Sie mit diesem anderen Ergebnis:

CM001 | 2,4,1
CS7 | 2
JUH768 | 2,2,2
HG006 | 2
KG040 | 3,2,5

Aber auf diese Weise, wie man sehen kann, wähle ich verschiedene Unternehmen, die den aktuellen Tag nicht als letzten Liefertag haben.

So berechne ich eine dynamische Tabelle, die alle zukünftigen Datum enthalten:

declare @day int 
set @day=DATEPART(dw,GETDATE())-1 
declare @week int 
set @week=7 
declare @extra table 
(extraday varchar) 
while (@day<@week) 
begin 
insert into @extra (extraday) values (@day) 
set @[email protected]+1 
end 

Dieses gib mir dieses Ergebnis: Days of the week future than the current one

Ich versuche, mach anders, mach mit, Unterschied, aber ich bekomme nicht nur die Firmen mit dem letzten Liefertag wie heute.

Wissen Sie, wie kann ich es beheben? oder wenn Sie eine andere Idee haben, wie ich es tun kann, lassen Sie es mich wissen.

Vielen Dank, Carlo

+0

Carlo, nimm die letzte Zeile und entferne die letzte Wildcard, wie diese - 'und cfv.value wie '%' + cast (@today als VARCHAR)'. Damit stellen Sie sicher, dass Sie wie zuvor ein Zeichenfolgenmuster xxx2 statt xx2xx suchen. Sie könnten sogar genauer sein und so diesen '' und cfv.value wie '%', + Cast (@today als VARCHAR) 'fügen Sie ein Komma nach dem ersten Platzhalter hinzu. –

+0

Hallo Steve, vielen Dank für die Tipps, es könnte helfen, aber mein Problem ist, dass die Nummer nicht jedes Mal in Reihenfolge ist, irgendwann kann man 1,4,2 finden. In diesem Fall ist der Tag 2 an der letzten Stelle in der DB, aber es ist nicht der letzte Liefertag ... noch mehr Tipps pls? : D –

+0

Nun, Sie müssten definieren, wie Sie den letzten Liefertag in Ihrer Zeichenfolge bestimmen. Wenn Sie die Kontrolle darüber haben, zwingen Sie es an eine bestimmbare Position und suchen Sie immer danach. Wenn Sie mir ein bewegliches Ziel geben und mir keine Möglichkeit geben, vorherzusagen, wo es sein wird, können Sie nicht erwarten, dass ich es treffe. –

Antwort

0

Es ist wie Sie bedingte Logik in Ihrer WHERE Klausel zu implementieren versuchen aussieht, aber Sie es falsch gehen. Sie müssen entweder die Anweisungen auflösen oder dynamische String-Erstellung verwenden, um die Abfrage zu erstellen und auszuführen. Es sollte ungefähr so ​​aussehen. Abhängig von Ihren Validierungsroutinen für @today möchten Sie vielleicht einen Schutz hinzufügen, der vor SQL-Injection schützt.

declare @today int 
set @today=DATEPART(dw,GETDATE())-2-2 
print @today 

declare @nsql nvarchar(max) 

set @nsql=N' 
select 
    cast (cfv.value as VARCHAR) 
from 
     CompanyFieldvalues cfv 
    join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where 
     cf.name=''NextDeliveryDates'' 
    and cfv.companyId in 
    (
     select cfv.companyId 
     from 
       CompanyFieldvalues cfv 
      join Companies c on c.companyId=cfv.companyId 
     where 
      cfv.value=''Retailer'' and c.status=1 
    ) 
    and ( cfv.value like ''%,''' + cast(@today as VARCHAR)+' 
     or cfv.value like ''%''' + cast(@today as VARCHAR) 


if (@today != 0 or @today!=1) 
set @[email protected]+N' 
     and ((cfv.value not like ''%,0'' or cfv.value not like ''%,1''))' 

print @nsql 
--exec sp_executesql @nsql 
+0

mmmm Ich konnte es nicht tun :(aber am Ende löste ich auf andere Weise;) Ich werde die Lösung posten –

0

Sehen, dass die Datenstruktur ist diese: 2,3,4,5,6,0,1, fand ich eine teilweise Lösung auf diese Weise:

declare @today int 
set @today=DATEPART(dw,GETDATE())-2-2 
print @today 
select cast (cfv.value as VARCHAR) 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 
and (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) 

Wenn der Tag mit dem heutigen Tag endet es die letzte ist; aber ich habe noch Ausnahme: Beispiel: 4,5,0 2,1 etc ....

zu lösen, dass ich hart ein IF zu tun, aber ich erhalte eine Fehlermeldung, weiß jemand, wie ich kann es bitte tun?

declare @today int 
set @today=DATEPART(dw,GETDATE())-2-2 
print @today 
select cast (cfv.value as VARCHAR) 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 
and (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) and (
     if (@today != 0 or @today!=1) 
      (cfv.value not like '%,0' or cfv.value not like '%,1') 
    ) 

Dies ist der Fehler:

Msg 156, Level 15, State 1, Line 14 Incorrect syntax near the keyword 'if'. Msg 102, Level 15, State 1, Line 15 Incorrect syntax near 'cfv'.

0

SOLUTION (vielleicht nicht die beste, aber es funktioniert, wenn es mich wissen, pls nicht zulassen, ist: S aber ich getestet und sieht in Betrieb):

declare @today int 
set @today=DATEPART(dw,GETDATE())-2 /*-2 because the date are managed from a c# code so I need in this way to have the day in the format Monday=0, etc*/ 
declare @case as CHAR (5) 
if (@today=0)(select @case='zero') 
if (@today=1)(select @case='one') 
if (@today>1)(select @case='other') 
select cfv.value, cfv.companyId 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 
and 
CASE 
    WHEN ((@case='other') AND (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR) 
    or cfv.value like '%' + cast (@today as VARCHAR)+',0' 
    or cfv.value like '%' + cast (@today as VARCHAR)+',0,1' 
    or cfv.value like '%' + cast (@today as VARCHAR)+',1')) 
    then 1 
    WHEN ((@case ='zero') AND(cfv.value='0')) THEN 1 
    WHEN ((@case ='one') AND(cfv.value='1' or cfv.value='0,1')) THEN 1 
    ELSE 0 
END = 1 

Vielen Dank für die Hilfe, Ihre Tipps hat mir sehr geholfen;)