2016-07-25 8 views
0

Ich führe SQL in Excel mit ADO in Excel-VBA aus. Und die Ergebnisse werden auf einem Excel-Arbeitsblatt angezeigt.Das SQL-Ergebnis ist wegen falscher SQL-Datumsvergleichseinstellung ungenau.

Es gibt ein Feld Datum in Arbeitsblatt 2014,2015,2016,2017

die Daten Beispiel genannt ist: 2/1/2014,7/1/2014,23/10/2014

dieses Feld Datentyp ist in Tag/Monat/Jahr. Und Datum wird kombiniert durch = DATUM (Zelle1, Zelle2, Zelle3) -Jahr, Monat, Tag. Das Datum in Tabellen sollte allesamt ein reines Datum sein, da ich 3 Zellen (Jahr, Monat, Datum) kombiniere) in 1-Feld (Datum)

'Dim two date variables 

Dim fromDate As Date 
Dim toDate As Date 

'Dim 4 integer variables 

Dim fromyear As Integer 
Dim toyear As Integer 
Dim frommonth As Integer 
Dim ToMonth As Integer 

'add combobox value 
With FromYearC 
.AddItem 2014 
.AddItem 2015 
.AddItem 2016 
.AddItem 2017 
End With 

'add combobox value 
With FromMonthC 
.AddItem 1 
.AddItem 2 
.AddItem 3 
.AddItem 4 
.AddItem 5 
.AddItem 6 
.AddItem 7 
.AddItem 8 
.AddItem 9 
.AddItem 10 
.AddItem 11 
.AddItem 12 
End With 

'Store combo box value into these 4 integer variables 

fromyear = FromYearC.Value 
frommonth = FromMonthC.Value 
toyear = ToYearC.Value 
ToMonth = ToMonthC.Value 

'Now i want to combine these variables and store into fromDate and toDate 
fromDate = DateSerial(fromyear, frommonth, 1) 
toDate = DateSerial(toyear, ToMonth + 1, 1) 

'it is still wrong , no matter orginal date format or new date format"dd/mm/yyyy" 
    fromDate = Format(fromDate, "dd/mm/yyyy") 
    toDate = Format(toDate, "dd/mm/yyyy") 

VBA Benutzeroberfläche: enter image description here Jetzt möchte ich den Datumsbereich zwischen from und todate setzen (beide inklusive)

ich die SQL-Referenz bauen zu: How to combine 3 VBA variable into date datatype in VBA

' This is the new SQL string 

WHERE date >= #" & fromdate & "# AND date<#" & toDate & "#" 

Problem:

Nun ist die SQL-Ergebnis ist völlig falsch (habe noch ausgegeben). Ich denke, die SQL Where-Klausel hat etwas falsch. Da das SQL ursprünglich richtig ist, ist die SQL falsch mit der where-date Auswahlklausel.

Oder ich habe versucht, where-between-Klausel zu verwenden. Das ist immer noch falsch.

date between #" & fromDate & "# and #" & toDate & "# 

Die vollständige SQL ist hier, aber ich denke, es ist zu lang

SELECT officer ,NULL, SUM(IIF(isnumeric(mkt) = true and Survey='CPI' and Activity='FI' and Outcome= 'C', Totalmin, 0)/468) , SUM(IIF(isnumeric(Non) = true and Survey='CPI' and Activity='FI' and Outcome= 'C', Totalmin, 0)/468) ,NULL ,NULL , IIF(ISNULL(sum(mkt)),0,sum(mkt)),Sum(Non),sum(ICP),(sum(mkt)+Sum(Non)+sum(ICP)) ,NULL,NULL,NULL,count(IIF(Survey='CPI' and Activity='FI' ,Totalmin, NULL)),NULL,count(IIF( Survey='CPI' and Activity='FI' and (Outcome ='C' OR Outcome='D'OR Outcome='O') , Totalmin, NULL)),NULL,SUM(IIF(Survey='CPI' and Activity='FI' ,Totalmin, 0)),NULL,SUM(IIF(Survey='CPI' and Activity='FI' and (Outcome ='C' OR Outcome='D') ,Totalmin, 0)) From (select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from [2014$] UNION ALL select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from [2015$] UNION ALL select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from 
[2016$] UNION ALL select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from [2017$])as table3 where officer is not null and officer <> '' and officer <> ' ' and date >= #" & fromDate & "# AND date<#" & toDate & "#" group by officer 

Update

Ich versuche hart Code zu verwenden

and date >= #1-3-2016# AND date<#31-3-2016# 

die SQL zu testen.

Es schlägt wie das ursprüngliche SQL fehl. Es kann die Ergebnisse ausgeben, aber das Ergebnis ist falsch.

Ich denke, ist es mit der UNION ALL verbunden? Als ich alle 4 Tabellen Datensätze zu einem großen Tisch zu verbinden.

Update 2

Ich glaube es ist nicht auf UNION ALL verwendet. Da das Excel-Spalte-Datum in 3 Zellen kombiniert ist - Jahr, Monat, Tag, ich kopiere und füge den Wert erneut. Die SQL-Ergebnisse haben Änderungen. Allerdings ist das Ergebnis immer noch falsch.

Dann habe ich versucht, harten Code zu testen. Zum Beispiel versuche ich auf 2016. März den Datensatz wählen Sie diese Klausel, wo Verwendung:

and month=3 and year=2016 

Es ist OKAY.

Dann habe ich versucht, diese Where-Anweisung unten zu verwenden. Das ist nicht OKAY.

date >= #2016-03-01# AND date<#2016-04-01# 

dann glaube ich es das Datum Datentyp Problem entweder in Excel oder VBA sein sollte.

Dann habe ich versucht, unter diese Tests zu tun:

Für Excel, der ursprünglichen Datentyp Datum Zeichenfolge ändern .i, numerisch, allgemeinen ... Nicht in Ordnung

Datum Beispiel: 6/1/2016 Zeichenkette Beispiel: 42375 numerisches Beispiel: 42375.00

Für VBA versuchte ich, den Monat und den Tag zu tauschen. -> # 2016-01-03 # Immer noch nicht OK

+0

Wie lautet Ihr Regionsdatum? TT/MM/JJJJ oder MM/TT/JJJJ? – Jules

+0

@Jules das Datum in Excel ist TT/MM/JJJJ. Ich ändere für die VBA-Date-Variable in TT/MM/JJJJ. Es ist aber immer noch falsch. 'fromDate = Format (fromDate," TT/MM/JJJJ ") toDate = Format (toDate," TT/MM/JJJJ ")' – Monchhichi

+0

Warum verwenden Sie 'date' als Spaltennamen? – KyloRen

Antwort

1

Sie müssen String-Variablen für die Datumsangaben fromDate und toDate erstellen und diese an die WHERE-Klausel übergeben. Ich schlage vor, dass Sie das ISO-Datumsformat verwenden. Zusätzlich zu, dass Probleme mit dem Spaltennamen Datum zu vermeiden, lassen Sie uns versuchen, die Datumsspalte in den eckigen Klammern umschließen (tun dies auch für die unioned Tabellen), wie folgt aus:

fromDateStr = Format(fromDate, "yyyy-mm-dd") 
    toDateStr = Format(toDate, "yyyy-mm-dd") 

"WHERE [date] >= #" & fromDateStr & "# AND [date]<#" & toDateStr & "#" 

Auf einer Seite zur Kenntnis, was passiert mit dieser Ausdruck DateSerial(toyear, ToMonth + 1, 1) wenn der Monat Dezember ist? Sollten Sie nicht DateAdd Funktion verwenden?

toDate = DateAdd("m", 1, DateSerial(toyear, ToMonth, 1)) 
+0

ausprobiert. immer noch falsch . – Monchhichi

+0

Zusätzliche Informationen, um den letzten Tag des Monats zu erhalten DateAdd ("d", - 1, DateAdd ("m", 1, "1 jan 2016")) – Jules

+0

Alternativ verwenden Format (fromDate, "TT mmm JJJJ") – Jules

Verwandte Themen