Avatar billede para7 Nybegynder
11. maj 2010 - 14:39 Der er 9 kommentarer og
1 løsning

DateDiff forskellig format

Jeg har et databasefelt ved navn clipAfspilletSidst, hvor der er skrevet et Now timestamp ind som her:
11-01-2010 04:35:05

Og så vil jeg gerne lave en sql sætning der henter en record fra denne form for dato 8 dage tilbage fra dags dato.

Problemet er, at date() giver formatet:
2010-05-11

Jeg fandt en funktion til at sætte manglende nuller, og jeg konverterede sådan:
Function pd(n, totalDigits)
    if totalDigits > len(n) then
        pd = String(totalDigits-len(n),"0") & n
    else
        pd = n
    end if
End Function
dateISO =  YEAR(Date()) & "-" &  Pd(Month(date()),2) & "-" & Pd(DAY(date()),2)
response.Write dateISO


Det så rigtigt nok ud, indtil jeg puttede det ind i datadd og fik fejl her:
response.Write DateAdd("d",dateISO,-8)

Så er det at jeg vi prøve at lave en udvælgelse:
clipAfspilletSidst LIKE '%" & DateAdd("d",dateISO,-8)

Er der nogen der har nogen guldkorn?
Avatar billede Slettet bruger
11. maj 2010 - 16:19 #1
jeps... prøv denne her:

"select * from din_tabel where ((datediff('d',clipAfspilletSidst,#" & now() & "#)>8 or datediff('d',clipAfspilletSidst,#" & now() & "#)=8)"

Det kan godt være det skal være <8 i stedet for >8 det kan jeg ikke helt gemmenskue... Men denne her skulle gerne finde datoer, som er ældre end 8 dage eller lig med 8 dage...

\Dan
Avatar billede para7 Nybegynder
11. maj 2010 - 16:27 #2
Tak Dan
Jeg har bikset noget opstilling sammen, der kører. Men det er faktisk data for den sidste uges mest populære, jeg skal hente. Så jeg har 8 linjer af kode plus en laaang sætning der henter datoerne ind.

Kan dit eksempel omskrives til at dække en uge?
Avatar billede Slettet bruger
11. maj 2010 - 16:43 #3
tjae... men der det så ikke nemmere med datepart i stedet?
Noget á la det her:

sidste_uge = datepart("ww",(dateadd("d",now(),-7)), vbmonday, vbfirstfourDays)
set rs = conn.execute("select * from din_tabel")
do until rs.EOF=True
clipAfspilletSidst=rs("clipAfspilletSidst")
if datepart("ww",clipAfspilletSidst,vbmonday,vbfirstfourdays)=sidste_uge then
'du viser noget...
end if
rs.movenext
loop
rs.close
set rs=nothing

\Dan
Avatar billede para7 Nybegynder
11. maj 2010 - 21:48 #4
Tak danielsen
Jeg er ikke stærk i datofomater. Men sidste_uge udskrevet giver 18 og det kan jeg ikke lige se giver mening.

Jeg har prøvet at sætte det ind uden held.

PS: Det er en MySql database. Feltets type er varchar.

Jeg har fx prøvet med noget som det her uden held:

'if datediff("d",rs("clipDato"),date) < 7 then
'if datediff("d","2010-04-23",date) < 7 then


Andre eksperters forslag uden held:

'strSQL = strSQL & "AND clipDato >= DATE_SUB(now(), INTERVAL 7 DAY)"
'strSQL = strSQL & "AND clipDato > DATE_SUB(NOW(), INTERVAL -7 DAY) "
'strSQL = strSQL & "AND clipDato BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 5 DAY) "
'strSQL = strSQL & "AND clipDato BETWEEN DATE_SUB(now(), INTERVAL 7 DAY) AND now() "
'strSQL = strSQL & "AND AND clipDato < DateAdd("d",date(),7) "

Mit eget er det eneste der virker indtil nu, men det er meget uflexibelt:

Function pd(n, totalDigits)
    if totalDigits > len(n) then
        pd = String(totalDigits-len(n),"0") & n
    else
        pd = n
    end if
End Function
dateISO =  YEAR(Date()) & "-" &  Pd(Month(date()),2) & "-" & Pd(DAY(date()),2)
'response.Write dateISO
'response.Write  DateAdd("d",-7,dateISO)

datePast001 = date()
dateGenerated00 = Year(datePast00) & "-" &  Pd(Month(datePast00),2) & "-" & Pd(Day(datePast00),2)
datePast01 = DateAdd("d",-1, date())
dateGenerated01 = Year(datePast01) & "-" &  Pd(Month(datePast01),2) & "-" & Pd(Day(datePast01),2)
datePast02 = DateAdd("d",-2, date())
dateGenerated02 = Year(datePast02) & "-" &  Pd(Month(datePast02),2) & "-" & Pd(Day(datePast02),2)
datePast03 = DateAdd("d",-3, date())
dateGenerated03 = Year(datePast03) & "-" &  Pd(Month(datePast03),2) & "-" & Pd(Day(datePast03),2)
datePast04 = DateAdd("d",-4, date())
dateGenerated04 = Year(datePast04) & "-" &  Pd(Month(datePast04),2) & "-" & Pd(Day(datePast04),2)
datePast05 = DateAdd("d",-5, date())
dateGenerated05 = Year(datePast05) & "-" &  Pd(Month(datePast05),2) & "-" & Pd(Day(datePast05),2)
datePast06 = DateAdd("d",-6, date())
dateGenerated06 = Year(datePast06) & "-" &  Pd(Month(datePast06),2) & "-" & Pd(Day(datePast06),2)
datePast07 = DateAdd("d",-7, date())
dateGenerated07 = Year(datePast07) & "-" &  Pd(Month(datePast07),2) & "-" & Pd(Day(datePast07),2)
datePast08 = DateAdd("d",-8, date())
dateGenerated08 = Year(datePast08) & "-" &  Pd(Month(datePast08),2) & "-" & Pd(Day(datePast08),2)

strSQL = strSQL & "AND (clipAfspilletSidst LIKE '%" & dateGenerated08 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated07 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated06 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated05 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated04 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated03 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated02 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated01 & "%' OR clipAfspilletSidst LIKE '%" & dateGenerated00 & "%') "
Avatar billede Slettet bruger
11. maj 2010 - 22:31 #5
nej! Du skal lave koden om... sidste_uge er ugenummeret på uge før nu! Altså uge 18 i denne uge.

Så laver du sql-udtrækket, uden nogle where-kriterier - og så laver du dit loop og henter clipAfspilletSidst=rs("clipAfspilletSidst")

og finder ugenummeret på den dato, nemlig: datepart("ww",clipAfspilletSidst,vbmonday,vbfirstfourdays)

Og så laver vi vores if-sætning, hvor vi sammenligher ugenummeret med sidste uge med ovenstående.

Sådan her:
sidste_uge = datepart("ww",(dateadd("d",now(),-7)), vbmonday, vbfirstfourDays)
set rs = conn.execute("select * from din_tabel")
do until rs.EOF=True
clipAfspilletSidst=rs("clipAfspilletSidst")
if datepart("ww",clipAfspilletSidst,vbmonday,vbfirstfourdays)=sidste_uge then
'du viser noget...
end if
rs.movenext
loop
rs.close
set rs=nothing

\Dan
Avatar billede para7 Nybegynder
12. maj 2010 - 08:50 #6
OK, tak igen. Jeg får nu uge 18, den forgangne uges klip vist. MEN jeg får alle vist. Vi mangler at sætte LIMIT 7, som jeg nu har slået fra i min sql sætning. Jeg har prøvet at tjekke min counter = counter +1. Men den har nogle høje numre. Har så forsøgt at nulsætte tælleren før den sættes ind i betingelsen, men uden held.
Har du en ide? Send lige svar. Det er allerede guldet værd :)
Avatar billede para7 Nybegynder
12. maj 2010 - 08:58 #7
PS: Har faktisk droppet at vise sidste uges mest sete.
Det kan jo faktisk ikke lade sig gøre at detecte hvilke klip der er spillet mest i den sidste uge, kun hvilke der er afspillet. Feltet clipAfspilletSidst indeholder jo kun en dato. Selve tæller-felt i databasen bliver jo tilføjet et nummer når det bliver spillet, og så vises de klip der har størst antal visninger, og det kan jo være et gammelt klip som vil blive ved med at ligge øverst. Så skulle jeg oprette et nyt felt der hedder clipTaellerSidsteUge, og den skulle sættes til at optælles - men det er ret langhåret...
Avatar billede para7 Nybegynder
14. maj 2010 - 10:18 #8
Er du stadig med danielsen?
Avatar billede Slettet bruger
18. maj 2010 - 16:22 #9
Ja! Jeg er her skam... Jeg har bare været på ferie - og er først tilbage nu...

Jeg kan se du har droppet det igen. Og i så fald synes jeg bare du skal beholde dine point.

\Dan
Avatar billede para7 Nybegynder
22. august 2010 - 09:46 #10
Tak til dannielsen
Lukker...
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
Kategori
Kurser inden for grundlæggende programmering

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