Avatar billede DK_Bear Praktikant
05. april 2016 - 03:08 Der er 11 kommentarer og
1 løsning

DATEDIFF+COUNT problemer

Nu har jeg rodet med Datediff + Count i flere dage nu :-(
Er ikke en ørn til det, men får somregel mine ting til at virke :-)

Skal ha checket om datoen i en DB er ældre end f.eks 30dage gammel.

Værdi = 30 (dage)

datediff(d, '02-01-2016', 01-02-2016) = 30

SQL ="SELCECT count(*) FROM as Antal FROM dato WHERE [X1] AND .osv."

[X1] hvad skal der stå her.....
DatoNu = now()) [ f.eks. 01-02-2016 ]
Datofør = [ skal jeg ha fundet, men 30 dage tilbage ]

Hvordan skal min SQL se ud?
Avatar billede DK_Bear Praktikant
05. april 2016 - 03:15 #1
Damn, er ski træt nu.... :-|

ikke ÆLDRE men YNGRE end 30 dage gamle, hvis ældre end 30 gamle skal den ikke tælles med...

Dog kan feltet "dato" også indeholder ingen data...
Avatar billede terry Ekspert
05. april 2016 - 09:32 #2
The first thing you need to look at is the way you format your dates. In SQL you should NOT use Danish format DD MM YYYY. You should use the US format MM DD YYYY or ISO YYYY MM DD
Avatar billede petersen7913 Forsker
06. april 2016 - 08:15 #3
Jeg har lavet et lille eksempel så du kan se hvordan du KAN formattere og så bruge DateDiff og IIF til at teste.

Læg mærke til rækkefølgen i DateDiff :) Der er ret stor forskel på om du bruger 'i dag minus en anden dato' eller 'en anden dato minus i dag'.


select    Format(Now(), "dd/mm/yyyy") AS Idag,
    Format (#03/03/2016#, "dd/mm/yyyy") AS Old,
    Format (#23/03/2016#, "dd/mm/yyyy") AS New,

    DateDiff("d", Old, Idag) AS AOld,
    DateDiff("d", New, Idag) AS ANew,

    IIF(DateDiff("d", Old, Idag) < 30, "Brug den her", "For gammel") AS A1,
    IIF(DateDiff("d", New, Idag) < 30, "Brug den her", "For gammel") AS A2,

    DateDiff("d", Idag, Old) AS BOld,
    DateDiff("d", Idag, New) AS BNew,

    IIF(DateDiff("d", Idag, Old) < 30, "Brug den her", "For gammel") AS B1,
    IIF(DateDiff("d", Idag, New) < 30, "Brug den her", "For gammel") AS B2
Avatar billede fdata Forsker
06. april 2016 - 11:33 #4
SELECT DinTabel.* From DinTabel WHERE DinDato < Date()-30
Avatar billede DK_Bear Praktikant
06. april 2016 - 12:08 #5
Var godt træt da jeg skrev indlægget... :-(

DATEDIFF(datepart,startdate,enddate) [w3schools]

datepart = "d"
startdate = gamle dato (f.eks. 01-01-2016)
enddate = ny dato (idag. 06-04-2016)

Resultet bliver 96

Det jeg er ude efter er lidt omvendt

- id1 ------------------------
Har resultat f.eks. 30
Har enddate = idag. 06-04-2016
men mangler startdate
------------------------------

skulle gerne kunne bruge det i en SQL ala

SQL = "Select count(*) as BNew FROM data WHERE Left(dato,10)>'21-03-2016'"

vil i mit tilfælde give 5 poster fra min DB og som er sandt, her er startdate = 16 (hvis jeg har regnet rigtig) startdate er jeg sat af mig her, men det er den jeg vil regne tilbage med f.eks. 30 dage fra dags dato...

jeg vil gerne kunne sætte datoen ind i SQL alt efter hvor mange dage jeg vil tilbage

hvis du kan følge mig :-)
Avatar billede DK_Bear Praktikant
06. april 2016 - 12:21 #6
LOL fdata, TUSIND tak for det, så nemt kunne det være, kunne bare IKKE se skoven for bare træer...

igen tusind tak......
Avatar billede fdata Forsker
06. april 2016 - 13:19 #7
Hi hi. Af og til skal man bare "tænke gammeldags" i stedet for at grave sig ned i formler. Takker for point  ;O)
Avatar billede DK_Bear Praktikant
06. april 2016 - 13:42 #8
Damn it, testede det og det virkede, men efter jeg prøvede på andre tabeler så virker det ikke, jeg gør et eller andet forkert :-(


8 data i DBen
1 fra 2014
1 fra 2015
2 fra 2016
4 fra 2016 fra før FindDatoen [ 07-03-2016 ]

S01 siger 0
S02 siger 8

her er min SQL og andet

FindDatoen=(Date()-30) [ 07-03-2016 ]

S01 med >
---
SQL = "Select count(*) as BNew FROM minTabel WHERE ( Left(minDato,10)>'"&FindDatoen&"' )"

efter mit bette hoved skulle den finde alle data fra 29-09-2015 og frem til idag

S02 med <
---
SQL = "Select count(*) as BNew FROM minTabel WHERE ( Left(minDato,10)<'"&FindDatoen&"' )"

skulle finde alle data fra 07-03-2016 og tilbage tidernes morgen.

Har på fornemmeren jeg laver en GROV fejl et eller andet sted... :-(

Det må ski da lade sig gøre....
Avatar billede DK_Bear Praktikant
06. april 2016 - 13:45 #9
LOL ikke 29-09-2016 men 07-03-2016

(Ærten ha det ski ikke ret godt idag) :-(
Avatar billede fdata Forsker
06. april 2016 - 15:31 #10
Access og datoer er ikke gode venner. Datoer skal formateres inden de kan bruges i SQL-sammenhæng. Lidt inspiration:

Sub Test()
  Dim FindDatoen As Date
  Dim SQL As String
 
  FindDatoen = Date - 30
 
  Debug.Print DCount("*", "Tabel1", "Felt1 > #" & Format(FindDatoen, "mm/dd/yyyy") & "#")
End Sub
Avatar billede DK_Bear Praktikant
06. april 2016 - 16:32 #11
"fdata" takker igen og især for response :-)

Har fået det til at kører 100% perfekt på anden måde.

Da jeg looper igen DB for kategorier, troede jeg det var nemt at finde antallet, men ak nej, blev nød til at lave min egen loop i kategori loopen, plejer også at hoppe over på den måde :-) men det er langt tid siden jeg havde brug for at  gøre det på den måde, men den virker perfekt til det jeg skal bruge det til...

Men en stor tak til dig, for det fik (Ærten) til at arbejde lidt mere :-)
Avatar billede fdata Forsker
06. april 2016 - 20:18 #12
Velbekomme og tak for point ;O)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester