kostenloser Webspace werbefrei: lima-city


Bräuchte Vorschlag für korrekte SQLite-Select-Abfrage

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Bräuchte mal kurz eure Hilfe für eine tag/datum">Datumskalkulation innerhalb einer SELECT-Abfrage.

    Folgendes Problem:

    Ich habe eine Tabelle namens reg_10000043.
    In dieser Tabelle befinden sich die Felder typeID, duration und issued.

    typeID ist ein Kenncode für eine Ware in einer Kauforder.
    duration ist die Anzahl der Tage, für die die Kauforder gültig ist.
    issued beinhaltet das Datum und die Zeit, in der die Kauforder erstellt wurde.

    Ich möchte nun alle Waren vom Typ "typeID" Abfragen, deren Einstellungsdatum (issued) größer ist, als das aktuelle Datum abzüglich der Tagesanzahl (duration).
    Soll heißen, ich möchte einfach alle noch aktiven Kauforders einer Ware abfragen....also jene, die laut Anzahl der Tage noch nicht abgelaufen sein sollten.

    Ich habe mich nun etwas in SQLite's Datumsfunktionen belesen, allerdings komme ich nicht ganz dahinter, wie das zu laufen hat.
    Meine aktueller Query sieht so aus:
    SELECT price FROM `reg_" + regionID + "` WHERE typeID = '" + typeID + "' AND issued > datetime('" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + "', - duration);


    Mit eingesetzten Werten sieht der dann so aus:
    SELECT price FROM `reg_10000043` WHERE typeID = '22546' AND issued > datetime('2012-07-13 09:20:00', - duration);


    Ich prüfe also, ob das Einstellungsdatum (issued) noch größer ist, als das aktuelle Datum minus der Tagesanzahl (duration).
    Auf das Feld "duration" müsste ich immer direkt in der Datenbank, also direkt in der SELECT-Abfrage zugreifen....denke hier hab ich schon einen Fehler. (aber wie gehts richtig?)

    Die datetime() Funktion hab ich mir hier mal angesehen: http://www.sqlite.org/lang_datefunc.html
    Laut der Dokumentation, müsste der Befehl folgende Struktur haben: datetime(timestring, modifier, modifier, ...)
    Wobei der erste modifier die Anzahl der Tage angibt, die hinzugefügt werden sollen.
    Wenn ich also eine negative Zahl angebe, müsste die abgezogen werden.

    The time string can be followed by zero or more modifiers that alter date and/or time. Each modifier is a transformation that is applied to the time value to its left. Modifiers are applied from left to right; order is important. The available modifiers are as follows.

    1 NNN days
    2 NNN hours
    3 NNN minutes
    4 NNN.NNNN seconds
    5 NNN months
    6 NNN years
    7 start of month
    8 start of year
    9 start of day
    10 weekday N
    11 unixepoch
    12 localtime
    13 utc


    Nur hängt sich die Query nach der Ausführung sofort auf.
    Weiß jemand, wie man das richtig macht? =)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo,

    da ich leider grad wenig Zeit habe, dein Problem aber trotzdem gelesen, schreib ich dir kurz.

    Auf der Seite die du verlinkt hast steht sinngemäß: "datetime gibt das Format YYYY-[...] aus.
    Weiter unten in einem Beispiel steht:
    SELECT datetime(1092941466, 'unixepoch', 'localtime');

    Würde also heißen, dass dort ein Timestamp gefordert wird. Hoffe ich konnte dir erstmal weiter helfen. Falls sich dann noch niemand anders gemeldet hat, werd ich mir das nochmal ansehen.
  4. Hui,
    ich habe mir deine Aufgabe jetzt zum 10. mal durchgelesen und werde jedes mal verwirrter.:confused:

    Um nicht gleich den Verstand zu verlieren, hier findest du deine Lösung:
    DATE_SUB

    Alternativ geht auch diese Funktion, vorausgesetzt du speicherst gleich beim Eintragen der Dauer das Enddatum mit Zeit ab. Anstatt nur die Tage.
    Damit ersparst du dir weiteres rechnen. :wink:
    DATE_DIFF

    Beitrag zuletzt geändert: 13.7.2012 15:27:05 von kgreen
  5. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Hui,
    ich habe mir deine Aufgabe jetzt zum 10. mal durchgelesen und werde jedes mal verwirrter.:confused:

    Ja, ich hol da immer etwas aus. :wink:

    Um auf den Punkt zu kommen, was ich eigentlich bräuchte....
    Ich habe einen DataReader, der alle Waren aus der Datenbank auslesen soll, deren Marktorder noch nicht abgelaufen ist.
    Damit das funktioniert, müsste ich aber den Wert der Tage, die direkt in der Tabelle in der Spalte "duration" stehen vom aktuellen Datum abziehen.
    Ich bräuchte also die Möglichkeit, den Duration-Wert der aktuellen Datensatzes der gerade vom Reader bearbeitet wird, vom aktuellen Datum abzuziehen....und hier blicke ich nicht ganz durch.

    Wie führe ich in einer SELECT Anweisung eine Berechnung mit einer Spalte innerhalb des Datensatzes aus, den der Reader gerade überprüft?
    Also laut dem Link den Du gepostet hast als Pseudocode zum Verständnis zum Beispiel: DATE_SUB('" + datum + "', [duration])
    Wie greife ich auf den Wert der Spalte "duration" zu, um damit zu berechnen, ob das aktuelle Datum abzüglich der Tage in der Spalte "duration" des aktuellen Datensatzes der gerade von der while-Schleife des DataReaders bearbeitet wird kleiner ist, als das Einstellungsdatum.

    ....es klingt noch immer zu kompliziert....ich kanns nicht einfacher erklären. :biggrin:

    Ich möchte den Wert einer Spalte zur Berechnung für die Gültigkeit der Expression in einer SELECT Abfrage verwenden.
    Soll heißen, ob der Datensatz gültig ist, soll erst berechnet werden, während der Reader liest.

    Beitrag zuletzt geändert: 13.7.2012 21:19:04 von adelwoehrer
  6. Hallo adelwoehrer,

    das hier sollte den Trick tun:
    SELECT price
    FROM reg_" + regionID + " 
    WHERE typeID = '" + typeID + "' AND
        (JULIANDAY(DATE('now'))  -
         JULIANDAY(DATE(issued,'+'||duration||' days')) <= 0);
  7. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    das hier sollte den Trick tun:


    Super, das klappt soweit, danke Dir.
    Ich hätte das nun aber gerne auf die Sekunde genau....ich denke, diese Abfrage prüft jetzt nur auf den Tag genau, oder?
    Denke ich hab schon die Lösung und das scheint auch zu funktionieren, könntest Du trotzdem mal schnell drüber schauen und mir sagen, ob das so passt?

    SELECT price FROM `reg_10000043` WHERE typeID = '22546' AND (DATETIME('now')  - DATETIME(issued,'+'||duration||' seconds') <= 0);


    Beitrag zuletzt geändert: 13.7.2012 21:15:37 von adelwoehrer
  8. Hallo adelwoehrer,

    das mit dem DATETIME() anstelle von DATE() ist richtig. Aber 'duration' ist ja immer noch in Tagen also muss der letzte Ausdruck
    DATETIME(issued,'+'||duration||' days')
    sein.

    Edit:
    Und auf das JULIANDATE() solltest Du normalerweise nicht verzichten, da DATETIME() wieder einen String zurückliefert und JULIANDATE() daraus erst einen Float macht.

    Beitrag zuletzt geändert: 13.7.2012 21:29:01 von darkpandemic
  9. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Und auf das JULIANDATE() solltest Du normalerweise nicht verzichten, da DATETIME() wieder einen String zurückliefert und JULIANDATE() daraus erst einen Float macht.


    Sicher, dass es (JULIANDAY(DATETIME('now')) ist?

    Laut Beschreibung liefert JULIANDAY ja die Anzahl der Tage zurück....berücksichtigt der Wert auch die Tageszeit, damit die Berechnung genau läuft?
    The julianday() function returns the Julian day - the number of days since noon in Greenwich on November 24, 4714 B.C.
  10. Hallo adelwoehrer,

    JULIANDAY() wandelt ein Datum oder einen Timestamp in eine Fließkommazahl um. Dabei entspricht der Ganzzahlanteil den Tagen und die Uhrzeit findet sich in den Nachkommastellen wieder. Und im Zweifelsfall kannst Du es ja einfach ausprobieren indem Du
    JULIANDAY(DATETIME('now'))
    in die SELECT-Klausel aufnimmst ;-)
  11. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Das glaub ich Dir schon, ich hab nur null Schimmer von Datumsfunktionen in SQLite, deshalb frag ich lieber zweimal. :biggrin:
    Problem sollte damit gelöst sein, vielen Dank.
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!