Avatar billede steen_hansen Forsker
19. februar 2022 - 10:32 Der er 32 kommentarer og
1 løsning

Find den 1. i måneden for de næste 2 måneder

Hvordan finder jeg den første i måneden for de første 2 måneder?

Eksempel:

Det er i dag den 18. september 2022.
Den første i den næste måned er den 1. oktober 2022
Den første i den efterfølgende måned er den 1. november

Det er i dag den 14. november 2022
Den første i den næste måned er den 1. december 2022
Den første i den næste måned er den 1. januar 2023

Jeg er simpelthen kørt fast i DateAdd og DadeDiff etc. Håber der er én, der har styr på det.
Avatar billede softspot Forsker
19. februar 2022 - 13:04 #1
Find den 1. i den aktuelle måned ved at trække dagen minus en (f.eks. 18-1) fra den aktuelle dato og læg så en måned til den dato du får ud af det. Noget i stil med:

dato = cdate("2022-09-18")
foersteIDenneMaaned = dateadd("d", -(day(dato) + 1), dato)
foersteINaesteMaaned = dateadd("m", 1, foersteIDenneMaaned)

Når du først har fat i en måned som er den 1. i måneden, kan du bare bruge dateadd("m",...) til at spole kalenderen fremad.

Skal du bruge den sidste i måneden, kan du blot trække en dag fra den første i næste måned...
Avatar billede steen_hansen Forsker
19. februar 2022 - 13:28 #2
@softspot Det var også noget i denne retning jeg eksperimenterede med. Men man skal kunne vælge hvis vi taler om i dag) den 1. marts 2022 eller den 1. april 2022

I dit eksempel har du

dato = cdate("2022-09-18")

Hvordan får jeg dags dato, uden selv at instaste den?
Avatar billede softspot Forsker
19. februar 2022 - 13:31 #3
Du kan bruge now (måske er det now())
Avatar billede steen_hansen Forsker
19. februar 2022 - 13:32 #4
Cdate(date) ...........? Jeg er ikke sikker :)
Avatar billede softspot Forsker
19. februar 2022 - 13:40 #5
Now returnerer den aktulle dato som en dato type, så du burde blot kunne gøre således:

dato = now
foersteIDenneMaaned = dateadd("d", -(day(dato) + 1), dato)
foersteINaesteMaaned = dateadd("m", 1, foersteIDenneMaaned)

Eller blot undlade den ekstra variabel (dato) og så bruge now i stedet...
Avatar billede steen_hansen Forsker
19. februar 2022 - 13:51 #6
Jeg testede (omskrev variabelnavnene lidt)

                                                    <%
                                                        dato = now
                                                        FirstOfThisMonth = DateAdd("d", -(day(dato) + 1), dato)
                                                        FirstOfNextMonth = DateAdd("m", 1, FirstOfThisMonth)
                                                        FirstOfNextNextMonth = DateAdd("m", 2, FirstOfThisMonth)
                                                    %>
                                                        <%=FirstOfNextMonth%>  <%=FirstOfNextNextMonth%>

Men så får jeg

28-02-2022 13:47:2030-03-2022 13:47:20

Skilt ad:

28-02-2022 13:47:20
30-03-2022 13:47:20

Dvs jeg får den sidste i denne måned og den sidste i næste måned

Hvor det burde have været den første i næste måned + den første i næste måned igen :)
Avatar billede steen_hansen Forsker
19. februar 2022 - 13:54 #7
Og klokkeslættene burde ikke komme med
Avatar billede steen_hansen Forsker
19. februar 2022 - 13:58 #8
Renset for tabulatorer:

dato = now
FirstOfThisMonth = DateAdd("d", -(day(dato) + 1), dato)
FirstOfNextMonth = DateAdd("m", 1, FirstOfThisMonth)
FirstOfNextNextMonth = DateAdd("m", 2, FirstOfThisMonth)

<%=FirstOfNextMonth%>  <%=FirstOfNextNextMonth%>
Avatar billede softspot Forsker
19. februar 2022 - 14:13 #9
Det er mig der har lavet en hjerneprut. Der skal naturligvis ikke lægges en til day(dato) inden værdien negeres, men efter, så jeg har fjernet paranteserne omkring udtrykket.

dato = now
FirstOfThisMonth = DateAdd("d", -day(dato) + 1, dato)
FirstOfNextMonth = DateAdd("m", 1, FirstOfThisMonth)
FirstOfNextNextMonth = DateAdd("m", 2, FirstOfThisMonth)

Mht. tidspunktet for datoen, så er det vist mest et spørgsmål om formatering, og det må kunne klares med FormatDateTime. Noget i stil med dette:

<%=FormatDateTime(FirstOfThisMonth, 2)%>

Mere om FormatDateTime:
https://www.w3schools.com/asp/func_formatdatetime.asp

Formaterne følger (vist nok) LCID, altså dit valg af locale, så hvis du skal have danske formater, skal du skifte locale til dansk.

Locale sættes på session, så:

session.LCID = 1030

Mere om LCID:
https://www.w3schools.com/asp/prop_lcid.asp

Oversigt over locale-koder:
https://w3schools.sinsixx.com/vbscript/func_setlocale.asp.htm
Avatar billede steen_hansen Forsker
19. februar 2022 - 14:21 #10
Så fik jeg fjernet klokkeslættet

<%
dato = date()
FirstOfThisMonth = DateAdd("d", -(day(dato) + 1), dato)
FirstOfNextMonth = DateAdd("m", 1, FirstOfThisMonth)
FirstOfNextNextMonth = DateAdd("m", 2, FirstOfThisMonth)
%>
                                                        <%=FirstOfNextMonth%>
<%=FirstOfNextNextMonth%>

Så skal dette bare rettes fra

28-02-2022
30-03-2022

Til

01-03-2022
01-04-2022
Avatar billede softspot Forsker
19. februar 2022 - 14:32 #11
Kig lige en ekstra gang på min kode ovenfor, specielt denne linje:

FirstOfThisMonth = DateAdd("d", -day(dato) + 1, dato)

kontra den du bruger:

FirstOfThisMonth = DateAdd("d", -(day(dato) + 1), dato)

Hint: paranteserne omkring day(dato) + 1 er fjernet i min version...
Avatar billede steen_hansen Forsker
19. februar 2022 - 14:42 #12
Jamen, for den da, softspot :) Jeg ved ikke hvor jeg fik det fra, jeg synes ikke jeg satte noget ind. Men skidt, det virker :) 1000 Tak for hjælpen :)
Avatar billede softspot Forsker
19. februar 2022 - 15:05 #13
Velbekomme :)
Avatar billede arne_v Ekspert
19. februar 2022 - 16:11 #14
d1 = DateAdd("d", -Day(Date()) + 1, Date())

og

d2 = DateSerial(Year(Now()), Month(Now()), 1)

returnerer samme resultat, men måske var den sidste nemmere at forstå.
Avatar billede steen_hansen Forsker
20. februar 2022 - 12:47 #15
Jeg forsøger at gemme det i MySQL\Type = Date

If Request("mode") = "createnewbulletin" Then
    removemessage = Request.Form("ChooseDate")
    Conn.Execute("INSERT INTO DB) VALES (removemessage)")

<%
    Dim ChooseDato, FirstOfThisMonth, FirstOfNextMonth, FirstOfNextNextMonth
    ChooseDato = date()
    FirstOfThisMonth = DateAdd("d", -day(ChooseDato) + 1, ChooseDato)
    FirstOfNextMonth = DateAdd("m", 1, FirstOfThisMonth)
    FirstOfNextNextMonth = DateAdd("m", 2, FirstOfThisMonth)
%>

<input type="radio" name="ChooseDate" id="ChooseDate1" checked><label for "ChooseDate1" value="<%=FirstOfNextMonth%>" class="mt-1"> &nbsp;<%=FirstOfNextMonth%></label>&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="ChooseDate" id="ChooseDate2" value="<%=FirstOfNextNextMonth%>"> <label for "ChooseDate2" value="<%=FirstOfNextNextMonth%>" class="mt-1"><%=FirstOfNextNextMonth%></label>

Men jeg får bare 0000-00-00 (yyyy-mm-dd) i databasen

Hvordan omskriver jeg det, så det bliver gemt som yyyy-mm-dd?

Det ovenstående HTML (formularfelter) er ikke så kønt, bare se bort fra det. Det kommer på plads senere.
Avatar billede steen_hansen Forsker
20. februar 2022 - 12:59 #16
Ah, jeg tror jeg har sat value på label. Tester af ...
Avatar billede steen_hansen Forsker
20. februar 2022 - 13:02 #17
Nej, det hjalp ikke. Har I nogen forslag?
Avatar billede steen_hansen Forsker
20. februar 2022 - 13:04 #18
<%
    Dim ChooseDato, FirstOfThisMonth, FirstOfNextMonth, FirstOfNextNextMonth
    ChooseDato = date()
    FirstOfThisMonth = DateAdd("d", -day(ChooseDato) + 1, ChooseDato)
    FirstOfNextMonth = DateAdd("m", 1, FirstOfThisMonth)
    FirstOfNextNextMonth = DateAdd("m", 2, FirstOfThisMonth)
%>

<input type="radio" name="ChooseDate" id="ChooseDate1" value="<%=FirstOfNextMonth%>" checked>
<label for "ChooseDate1" class="mt-1"><%=FirstOfNextMonth%></label>
<input type="radio" name="ChooseDate" id="ChooseDate2" value="<%=FirstOfNextNextMonth%>">
<label for "ChooseDate2" class="mt-1"><%=FirstOfNextNextMonth%></label>
Avatar billede softspot Forsker
20. februar 2022 - 15:08 #19
Nu ved jeg ikke om du har copy/pasted fra din kode, men jeg kan umiddelbart se et syntaktisk problem i din SQL (eller også er det bare fordi jeg ikke kender MySQL):

Conn.Execute("INSERT INTO DB) VALES (removemessage)")

vil jeg mene burde skrives således:

Conn.Execute("INSERT INTO DB VALUES (removemessage)")

Dernæst synes jeg det ser lidt shaky ud, når du blot tager datoen ind fra formularen uden at sikre, at der er tale om en dato. Igen kan det bare være min manglende forståelse af MySQL og den anvendte driver...
Avatar billede steen_hansen Forsker
20. februar 2022 - 15:33 #20
If Request("mode") = "createnewbulletin" Then
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''DENNE DEL ER GENNEMTESTET OG OK
        Dim RS
        Set RS = Conn.Execute("SELECT username, bulletinboard FROM count")
        If Not RS.EOF Then
            Do Until RS.EOF
                RSAddOne = RS("bulletinboard") + CInt(1)
                Conn.Execute("UPDATE count SET bulletinboard = " & RSAddOne & " WHERE username = '" & RS("username") & "'")
            RS.MoveNext
            Loop
        End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''DENNE DEL ER GENNEMTESTET OG OK

        Dim dato, author, headline, message, removemessage
        dato = Day(Date) & "/" & Month(Date) & "/" & Year(Date) & " " & Time()
        author = SQLEncode(Session("username"))
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''?
        removemessage = Request.Form("ChooseDate")
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''?

        Conn.Execute("INSERT INTO messages (dato, author, headline, message, removeat) VALUES (" & _
            "'" & dato & "', " & _
            "'" & author & "', " & _
            "'" & Trim(SQLEncode(Request.Form("headline"))) & "', " & _
            "'" & SQLEncode(Request.Form("vMessage")) & "', " & _
            "'" & removemessage & "')")
        Conn.Close

        Response.Redirect("/")
    End If
Avatar billede steen_hansen Forsker
20. februar 2022 - 15:40 #21
Hvis jeg benytter <input type="date"> bliver det gemt korrekt: yyyy-mm-dd

Men hvis jeg requester ChooseDate, bliver

<%=FirstOfNextNextMonth%>

til

0000-00-00

Når jeg udskriver <%=FirstOfNextNextMonth%> på siden, står det korrekt:

01-03-2022
01-04-2022

Men når jeg vælger en af de to (hvilken er ligegyldig), bliver resultatet altid 0000-00-00. Så et hurtigt gæt er, at der skal rokeres om på <%=FirstOfNextNextMonth%> på en eller anden måde, så der gemmes i yyyy-mm-dd
Avatar billede steen_hansen Forsker
20. februar 2022 - 15:43 #22
<%=FirstOfNextNextMonth%> = dd-mm-yyyy

Og det er korrekt udskrevet på siden: Den første marts 2022 / dd-mm-yyyy

Men når der gemmes i databasen, skal det gemmes som yyyy-mm-dd

...... vil jeg gætte på
Avatar billede steen_hansen Forsker
20. februar 2022 - 15:52 #23
Sådan bliver det gemt med en datepicker: <input class="date">

2022-03-01

Når jeg hiver denne dato ud på siden, kommer det til at stå korrekt: 01-03-2022


Og sådan her bliver det gemt med <%=FirstOfNextNextMonth%> eller <%=FirstOfNextNextNextMonth%>

00-00-0000
Avatar billede steen_hansen Forsker
20. februar 2022 - 15:54 #24
Rettelse:

Og sådan her bliver det gemt med <%=FirstOfNextMonth%> eller <%=FirstOfNextNextMonth%>

0000-00-00
Avatar billede steen_hansen Forsker
20. februar 2022 - 15:57 #25
"Dernæst synes jeg det ser lidt shaky ud, når du blot tager datoen ind fra formularen uden at sikre, at der er tale om en dato. Igen kan det bare være min manglende forståelse af MySQL og den anvendte driver..."

Når der benyttes "DateAdd" vil jeg næsten gå ud fra, at VB også tænker i datoformat. Eller ...?
Avatar billede steen_hansen Forsker
20. februar 2022 - 16:05 #26
Rettelse igen:

<input class="date"> = <input type="date">
Avatar billede softspot Forsker
20. februar 2022 - 17:26 #27
Ad #25: Well, dette sker jo ifm. opbygningen af din SQL-sætning og hentes råt fra Request.Form (som enhver kan sende til din server-kode - også dem som måske ikke lige poster med din formular => SQL Injection):

removemessage = Request.Form("ChooseDate")

Der bør foretages noget mere validering på den. Anyway! Det er et andet emne, så blot en sidebemærkning - selvom det bør være et fokuspunkt. Tjek evt. mulighed for brug af commands og parametre med din MySQL-driver.

Mht. datoerne, tænker jeg du skal prøve at formatere de datoer du indsætter i databasen i ISO8601-format (yyyymmddTHHnnss) i stedet. Det er et entydigt format i modsætning til locale-formaterne. Se evt. det godkendte svar i linket herunder for nogle hjælper rutiner (selvom du nok hurtigt kan ændre den du allerede har).

https://stackoverflow.com/questions/6900045/vbscript-iso8601/6900298#6900298
Avatar billede arne_v Ekspert
20. februar 2022 - 20:30 #28
Sådan noget skal jo ikke "tilfældigvis virke" - sådan noget skal virke fordi det er designet til at virke.

Du vedtager hvilket format dato skal angives i. dd/mm/yyyy eller yyyy-mm-dd eller noget helt tredie.

Så konverterer du dit Date objekt til streng i dette format når det skal vises.

Og du konverterer den streng til et Date objekt når du får det tilbage.

Når du skal bruge det i SQL så bruger du command og parameters, med dit Date objekt. Ingen problemer med format.
Avatar billede steen_hansen Forsker
21. februar 2022 - 06:51 #29
@softspot: Det ser interessant ud, men kræver vist en del nærlæsning og forståelse. Jeg går i krig på et tidspunkt :)

@arne_v: Det er sådan jeg gør med Day Month, Year og Time, hvis jeg skal registrere dato og tidspunkt.

Dim til DB:
dato = Day(Date) & "/" & Month(Date) & "/" & Year(Date) & " " & Time()

Udtræk fra DB:
vCreated = RS("dato")
vCreated = addZ(day(vCreated)) & "-" & addZ(month(vCreated)) & "-" & year(vCreated) & " " & addZ(hour(vCreated)) & ":" & addZ(minute(vCreated)) & ":" & AddZ(Second(vCreated))

Her bliver det så defineret hvordan det skal trækkes ud og præsenteres. "AddZ" er en funktion, som sætter et 0 (nul) foran, hvis datoen f.eks. er:

5/8/2022 17:41:14 = 05-08-2022 17:41:14

Når jeg benytter <input type="date">, og trækker datoen ud på en anden side, bliver det behandlet korrekt. Bare ikke i det ovenstående. Her bliver som sagt gemt 0000-00-00. Hvordan retter jeg til YYYY-MM-DD? Jeg antager, at det er derfor der bare bliver gemt 0'er istedet for datoen.
Avatar billede softspot Forsker
21. februar 2022 - 10:25 #30
Kan du ikke bare formatere din dato, så den er yyyy-mm-dd i stedet for dd-mm-yyyy?

vCreated = addZ(year(vCreated)) & "-" & addZ(month(vCreated)) & "-" & day(vCreated) & " " & addZ(hour(vCreated)) & ":" & addZ(minute(vCreated)) & ":" & AddZ(Second(vCreated))
Avatar billede steen_hansen Forsker
21. februar 2022 - 11:01 #31
softspot, det ovenstående eksempel er et "øjebliksbillede" af dato og tid, kan man vel sige. Her bliver den nuværende Date, Month, Year og Time fra serveren splittet op og gemt. Spørgsmålet er, hvordan laver jeg en Request.Form("ChooseDate"). og får det korrekt gemt som YYYY-MM-DD?
Avatar billede softspot Forsker
22. februar 2022 - 23:27 #32
Jeg vil mene der findes en funktion til at konvertere den streng som ligger i Request.Form("ChooseDate") til en dato (CDate eller DateSerial eller noget i den stil). Når først du har konverteret værdien til en dato, kan du bruge den på sammen måde som vCreated er brugt i #30...

eller er det mig der ikke forstår din problemstilling helt?
Avatar billede steen_hansen Forsker
25. februar 2022 - 20:15 #33
@softspot: Jeg har været rigtig langt omkring, så nu har jeg oprettet et nyt spørgsmål til dén del:

https://www.computerworld.dk/eksperten/spm/1039215

Det var i princippet også forkert at fortsætte denne tråd med en ny problemstilling :) Jeg håber der kommer noget brugbart ud af det
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