GetDay (LocalDatetimeToday)

Die wilde Inge

Commander
Registriert
Aug. 2009
Beiträge
2.165
Hi,

ich habe mal ein Problem in einem Reporting Tool.

Ich möchte einen Datumsbereich + X Tage angeben. Die X sollen aber variable sein.

Was ich nun brauche ich eine "Expression" die mir das ermöglicht und das kriege ich leider nur bedingt hin.

Folgende Expression funktiont und liefert mir das aktuelle Datum:

FormatString(

Code:
FormatString(

'{0:dd.MM.yyyy HH:mm:ss}',
 
 AddSeconds(
     AddMinutes(
            AddHours (GetDate(LocalDateTimeToday()), GetHour(LocalDateTimeNow())),
                  GetMinute(LocalDateTimeNow())) ,
   GetSecond(LocalDateTimeNow()))
 )

Funktionieren tut das, auch wenn ich nicht verstehe ich wie in AddHour sowohl GetDate als auch auch GetHour machen kann. Ich vermute mal der nimmt das dann als einen großen Block. Geschenkt.

Was ich bräuchte wäre wohl ein ADD auf alle Datumsbereiche.
Dann in der Reigenfolge: Add Second,Minutes,Hours,Year,Month,Day? Jeweils mit der passenden Get Funktion?

Code:
FormatString(

 '{0:dd.MM.yyyy HH:mm:ss}',

 

 AddSeconds(

     AddMinutes(

            AddHours (
         
                AddYears (
             
                    AddMonths (
                 
                        AddDays ( GetDay(LocalDateTimeNow())),
                     
                    GetMonth(LocalDateTimeNow())),
                 
                GetYear(LocalDateTimeNow())),
                         
            GetHour(LocalDateTimeNow())),

        GetMinute(LocalDateTimeNow())),

   GetSecond(LocalDateTimeNow()))

 )


funktioniert nicht :-D

Syntax ist okay, Klammern fehlen nicht. Der Fehler muss irgendwo anders liegen, ich weiß nur nicht wo, wenn die andere Funktion ja aber funktioniert.

Kann mir hier jemand auf die Sprünge helfen?

Sobald das funktioniert, kann ich dann bei GetDay noch sagen + VariableX und wäre fertig.

VG
 
Zuletzt bearbeitet:
Um was für ne Sprache geht's denn (ich vermute Powershell)? (für die Codeblöcke kann man eine Sprache auswählen).

Und ich verstehe noch nicht, was als Ergebnis rauskommen soll.
 
  • Gefällt mir
Reaktionen: aragorn92
Ich verstehe nicht ganz was du hier tust. Wenn ich einen Datumsbereich definieren will instanziere ich zunächst ein Date Object per:
Javascript:
var d = new Date();
und ändere dann mit einer der folgenden Varianten ab:
Javascript:
d.setHours(d.getHours() + x);
//und/oder
d.setMonth(d.getMonth() + x);
Formatierung als ISO string:
Javascript:
d.toISOString();
 
Es handelt sich um das ReportingTool Web Designer von DevExpress.
Der Report soll mir alle Einträge aus der DB ausgeben deren letztes Veränderungsdatum länger her ist als z.B. 10 Tage.

Ich habe Funktionen die sich auf einen Tag beziehen, also z.B. heute, gestern, LastWeek, so ein Kram.

Das bringt mir nur nichts, da ich ja variabel einstellen will ob es 10 oder eben auch 20 Tage sein sollen.

In einem Expression Editor kann ich also sagen [Letzte Änderung] <= LocalDateTimeLastWeek() und würde alle Datenbankeinträge sehen, die vor dem [ersten Tag der letzten Woche] zuletzt verändert wurden.

Das Problem ist jetzt, dass ich aber nicht sagen kann <= LocalDateTimeLastWeek()+10
Da kommt dann nichts bei raus. Das Addieren von einer Number zu einem Datetime geht nicht.

Überlegung war daher das Datum in seine Bestandteile aufzuspalten um dann dem GetDay meine + [Variable] hinzufügen. Die Variable kann ich vor Erstellung des Reports eingeben und dann sehe ich immr genau was ich will (so die Theorie).

Die von mir zuerst genannte Funktion, funktioniert ja. Sie gibt mir das aktuelle Datum wieder.

Code:
FormatString(

'{0:dd.MM.yyyy HH:mm:ss}',
 
 AddSeconds(
     AddMinutes(
            AddHours (GetDate(LocalDateTimeToday()), GetHour(LocalDateTimeNow())+2),
                  GetMinute(LocalDateTimeNow())) ,
   GetSecond(LocalDateTimeNow()))
 )

Wenn ich dem GetHour eine +2 zusteuere, dann ist das Datum 19:01 statt 17:01 (Stand jetzt)
Funktionieren würde das also grundsätzlich.

Ich kriege es nur nicht hin von GetDate zu GetDay zu kommen. GetDate ist das aktuelle Datum, GetDay der aktuelle Tag.

Programmiersprache könnte C# sein, so genau weiß ich das gar nicht, steht hier nirgends.
Ergänzung ()

@floq0r genau so habe ich es in NodeRed gemacht (JavaScript) :daumen: Funktioniert hier aber nicht.
 
Vielleicht muss ich mal im Herstellerforum nachfragen. Ich wollte nur vermeiden mir schon wieder irgendwo einen Account anlegen zu müssen...
 
Keine Ahnung ob das klappt, aber ich hab einfach mal Chatgpt gefragt.

Mich hatte eigentlich nur die Programmiersprache interessiert. btw. Chatgpt weiß es auch nicht :-D

Aber hier die Antwort:

Dein Problem scheint darin zu liegen, dass du versuchst, Datumsteile wie Jahr, Monat und Tag separat zu manipulieren, anstatt das gesamte Datum als eine Einheit zu behandeln. In den meisten Datum- und Zeitmanipulationssprachen und -funktionen arbeitet man mit Datum- und Zeitobjekten, und die entsprechenden Add-Funktionen erwarten ebenfalls ein solches Datum- oder Zeitobjekt.

Wenn du beispielsweise Tage zu einem Datum hinzufügen möchtest, würde man normalerweise eine Funktion wie AddDays direkt auf ein Datum- oder Zeitobjekt anwenden. Dein aktueller Ansatz, die einzelnen Teile wie Jahr, Monat, Tag, Stunde, Minute und Sekunde separat zu behandeln, führt zu Problemen.

Basierend auf deiner Beschreibung gehe ich davon aus, dass du ein Berichts- oder Abfragetool verwendest, das ähnliche Funktionen wie T-SQL, SSRS oder ein anderes BI-Tool hat.

Ich schlage vor, einen schrittweisen Ansatz zu verwenden, um die Variable Tage hinzuzufügen. Hier ist ein Beispiel, das auf deinem aktuellen Ansatz aufbaut, aber vereinfacht und korrigiert wurde:

SQL:
FormatString(
 '{0:dd.MM.yyyy HH:mm:ss}',
    AddDays(
        GetDate(LocalDateTimeToday()),
GetDay(LocalDateTimeNow()) + VariableX
    )
)

Hier ist die Erklärung:

  1. GetDate(LocalDateTimeToday()) holt das aktuelle Datum.
  2. GetDay(LocalDateTimeNow()) holt den aktuellen Tag.
  3. AddDays fügt die Variable VariableX zu dem Datum hinzu.
In vielen Tools, die für Berichte und Datenabfragen verwendet werden, würde das Datum und die Uhrzeit als ein Objekt behandelt. Deshalb solltest du sicherstellen, dass alle Datum- und Zeitmanipulationen auf einem vollständigen Datum- und Zeitobjekt basieren.

Falls dein Tool nicht direkt AddDays auf ein Datum-Objekt erlaubt oder es eine andere Syntax erwartet, könnte der folgende Ansatz funktionieren:


SQL:
FormatString(
 '{0:dd.MM.yyyy HH:mm:ss}',
    AddDays(
        GetDate(LocalDateTimeToday()),
        VariableX
    )
)

In diesem Fall wird VariableX als die Anzahl der Tage hinzugefügt.

Falls du zusätzliche Manipulationen für Stunden, Minuten, Sekunden usw. benötigst, stelle sicher, dass jede Funktion auf einem vollständigen Datum- und Zeitobjekt aufbaut. Beispielsweise:

SQL:
FormatString(
 '{0:dd.MM.yyyy HH:mm:ss}',
    AddSeconds(
        AddMinutes(
            AddHours(
                AddDays(
                    GetDate(LocalDateTimeToday()),
                    VariableX
                ),
                GetHour(LocalDateTimeNow())
            ),
            GetMinute(LocalDateTimeNow())
        ),
        GetSecond(LocalDateTimeNow())
    )
)

Dieser Ansatz stellt sicher, dass jede Zeitmanipulation auf dem gesamten Datum- und Zeitobjekt basiert und die Variable Tage korrekt hinzugefügt wird.

Falls dies immer noch nicht funktioniert, könnte es hilfreich sein, die genaue Syntax und Funktionen deines Berichts- oder Abfragetools in der Dokumentation nachzuschlagen, da verschiedene Tools unterschiedliche Funktionsnamen und Parametererwartungen haben können.
 
kenne die Bibliothek nicht, aber die Lösung für
Die wilde Inge schrieb:
Der Report soll mir alle Einträge aus der DB ausgeben deren letztes Veränderungsdatum länger her ist als z.B. 10 Tage
scheint gemäß deinen snippets:
Code:
AddDays(LocalDateTimeToday(), -10)

Das lässt sich aus der dich verwirrenden Zeile ableiten
Die wilde Inge schrieb:
Funktionieren tut das, auch wenn ich nicht verstehe ich wie in AddHour sowohl GetDate als auch auch GetHour machen kann.
da im Folgenden ziemlich sicher Jetzt und nicht nur Heute ermittelt wird
Die wilde Inge schrieb:
Folgende Expression funktiont und liefert mir das aktuelle Datum:
Code:
FormatString(

'{0:dd.MM.yyyy HH:mm:ss}',
 
 AddSeconds(
     AddMinutes(
            AddHours (GetDate(LocalDateTimeToday()), GetHour(LocalDateTimeNow())),
                  GetMinute(LocalDateTimeNow())) ,
   GetSecond(LocalDateTimeNow()))
 )
daher bedeutet:
AddHours (GetDate(LocalDateTimeToday()), GetHour(LocalDateTimeNow()))
addiere zu den Stunden bis Heute noch die Stunden der aktuellen Uhrzeit.

GetDate dürfte ein DatumObjekt erzeugen, daher dürfte im ReportTool die Zeile irgendwas ala
Code:
GetDate("Datum des zu untersuchenden ") < AddDays(LocalDateTimeToday(), -10)
lauten. Ohne ein unnötiges Konvertieren in strings mit FormatString
 
Zuletzt bearbeitet:
Danke für die Tipps. Ich probiere das mal und melde mich noch mal.
Mittlerweile kam mir noch in den Sinn, dass ich gar nicht weiß was passiert, wenn wir am beim 01. sind und ich sage, 10 Tage zurück.
Mit meiner Variante, das Datum ins Einzelteile zu zerlegen würde das ja gar nicht funktionieren (mutmaßlich). Ich muss also, wie angedeutet, das Datum als solches manipulieren.
Ergänzung ()

Das war jetzt alles richtig sinnlos :volllol:

Code:
FormatString(

'{0:dd.MM.yyyy HH:mm:ss}',
 
 AddSeconds(
     AddMinutes(
            AddHours (GetDate(LocalDateTimeToday()), GetHour(LocalDateTimeNow())-(?Days*24)),
                  GetMinute(LocalDateTimeNow())) ,
   GetSecond(LocalDateTimeNow())))

Ich hatte das Ergebnis längst. Statt Tage, drehe ich einfach die Stunden*24 hoch. Die Funktion verarbeitet das vollkommen normal. Now - 10*24 ist der 19.05.

Ich hätte das einfach mal vorher austesten sollen -.-

Danke für Eure Hilfe. Manchmal hilft es schon wenn man Sachen ausspricht.
 
Zuletzt bearbeitet:
Zurück
Oben