tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
602
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    elekk11 Tutorials.de Gastzugang
    Hallo,

    ich möchte prüfen ob ein Tag zwischen 28 und 31 zum aktuellen Monat passt. Heißt wenn eine 31 kommt, wir aber derzeit Februar haben, stimmt was nicht.
    Dafür hab ich ein simples switch hergenommen:

    switch(DataTime.Now.Month)
    {
    case 1: //Januar
    //Do Something
    break;
    case 2: //Februar
    //Do Something
    break;

    .
    .
    .
    .
    }

    12 cases sind viel, sieht nicht schön aus, ist nen Hauden Schreibarbeit UND das schlimmste ist das ein und derselve Code zigmal vorkommt.
    Gibt es denn eine Möglichkeit mehrere Fälle mit einem case abzudecken ? Weil im Grunde brauch ich ja nur 3 cases (Monate mit 31, 30 und 28 Tagen).

    Hab schon versucht:

    case: 1, 3, 5, 7, 8, 10, 12

    oder:

    case: 1 || 3 || 5 || 7 .......

    oder:

    case: 1 || case: 2 || case: 3 ......

    Geht aber alles nicht. Muss ich da jetzt echt 12 cases machen wovon in 7 zBsp derselbe Code steht ? Ist das nicht ein wenig redundant ?
     

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Ja:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    case 1:
    case 3:
    case 5:
        // code goes here
        break;
    case 2:
    case 4:
       // code goes here
       break;
     

  3. #3
    elekk11 Tutorials.de Gastzugang
    Ahh, doch alle 12 cases aber in der Reihenfolge in der sie zusammengehören und nur jeweils im Letzten den Code.

    Da muss man auch erst draufkommen, ich danke dir
     

  4. #4
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Und denke auch an die Schaltjahre
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  5. #5
    elek11 Tutorials.de Gastzugang
    Waak, gut das dus sagst, die hät ich vergessen !

    Muss ich jetzt erstmal bissi googeln wie man die berechnet

    Danke !
     

  6. #6
    napstermania napstermania ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Ort
    Deutschland
    Beiträge
    95
    Hallo,

    da musst du doch nicht viel berechnen. Die DateTime und TimeSpan Klassen nehemn dir viel Arbeit ab und wenn ich mich nicht irre berücksichtigt die DateTime Klasse auch das Schaltjahr. Aber wie gesagt so ganz sicher bin ihc mir da jetzt nicht. Und was genau willst du eigentlich berechnen? Wenn du jetzt als Beispiel die Jahre, Monate, Tage zwischen zwei Daten berechnen willst könnte das zB so aussehen...

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    private struct DateDiff
    {
        public int years, months, days;
    }
     
    private DateDiff calcDateDiff(DateTime d1, DateTime d2)
    {
            int years, months, days;
            years = d2.Year - d1.Year;
            DateTime dt = d1.AddYears(years);
            if (dt > d2)
            {
                years--;
                dt = d1.AddYears(years);
            }
            months = d2.Month - d1.Month;
            if (d2.Day < d1.Day) months--;
            months = (months + 12) % 12;
            dt = dt.AddMonths(months);
            days = (d2 - dt).Days;
            DateDiff ddf;
            ddf.years = years; 
            ddf.months = months; 
            ddf.days = days;
            return (ddf);
    }


    Allerdings solltest du dich vorher selbst vergewissern ob alles richtig ist. Ich lege meine hand nicht ins Feuer

    Gruß
     

  7. #7
    elekk11 Tutorials.de Gastzugang
    Ich schreibe mir einen eigenen kleinen Geburtstagsreminder in den ich Daten eintragen kann und er dann jedesmal beim Windowsstart prüft ob in den nächsten 7 Tagen was anliegt und entsprechend ein Fenster aufpoppt oder eben nicht.

    Die DateTime Objekte sind echt toll, das Problem ist nur das die Daten in einer Datenbank liegen und dort als "Text" gespeichert sind. Und ein DateTime Objekt gegen einen String vergleichen geht ja nicht, zumindest hab ichs nicht hinbekommen. Daher hab ich jetzt alles in Strings zerlegt und prüfe so.

    Geht ganz gut, etwas fisselig wirds erst wenn der nächste Geburtstag zBsp 5Tage entfernt liegt und dazu ein Monatswechsel stattfindet, weil dann muss ich ja wissen wieviele Tage der aktuelle Monat gerade hat, daher das switch
     

  8. #8
    Mel_One Mel_One ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Ort
    Zürich (Zürich)
    Beiträge
    167
    Guck dir mal die 2 Methoden DateTime.Parse und DateTime.TryParse an. Das nimmt dir da auch ziemlich Ärbeit ab.Z.B. zerlegen von irgendwelchen Strings.
    Da müsste es auch was geben, damit du angeben kannst, in welchen Formaten die Strings vorliegen. Guck dir dazu mal Formatstrings an. Dürfte alles in der MSDN-Library beschrieben sein.
     
    "Wenn Sie mich suchen, ich halte mich in der Nähe des Wahnsinns auf, genauer gesagt auf der schmalen Linie zwischen Wahnsinn und Panik, gleich um die Ecke von Todesangst, nicht weit weg von Irrwitz und Idiotie!"
    -- Bernd das Brot

  9. #9
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von elekk11 Beitrag anzeigen
    ich möchte prüfen ob ein Tag zwischen 28 und 31 zum aktuellen Monat passt.
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    int nDay = 28; // zum Beispiel
     
    DateTime oDt;
     
    if( DateTime.TryParse(String.Format("{0}.{1}.{2}", nDay, DateTime.Now.Month, DateTime.Now.Year), out oDt) )
    {
        // OK
    }
    else
    {
        // nicht OK
    }
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  10. #10
    elekk11 Tutorials.de Gastzugang
    Hi, danke für den Tip, so ist meine Klasse um die Hälfte geschrumpft

    Da ich jetzt aber ganz auf DateTime Objekte umgestiegen bin und auch die Datenbank auf Datum umgestellt habe statt auf Text, hab ich ein anderes Problem.
    DateTime Objekte besitzen ja immer (wie der Name schon sagt) Datum UND Uhrzeit.
    Selbst:

    DateTime today = DateTime.Now.Date

    ergibt: {21.05.2010 00:00:00}

    Ich muss in meiner Datenbank jetzt aber nach einem Datum suchen und das geht dann grundsätzlich schief. Hab jetzt ne Weile gegoogelt und es scheint wirklich keinerlei Date Typ ind .NET zu geben.
    Bleibt mir jetzt doch wieder nur der Weg über Stringbastelei ?
     

  11. #11
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Da verstehe ich das Problem nicht ganz. Wenn du mit Hilfe des Date-Members immer dafür sorgst, dass die Uhrzeit "00:00:00" ist, sollte das doch beim Vergleichen kein Problem sein?

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  12. #12
    Mel_One Mel_One ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Ort
    Zürich (Zürich)
    Beiträge
    167
    Naja, du hast ja String-Werte in der Datenbank...
    Code :
    1
    2
    
    DateTime date = DateTime.parse("17.02.1983");
    DateTime.ToString("dd.MM.yyyy").ToString("dd.MM.yyyy");
    Der To-String-Befehl würde dir wieder einen String im Stil von 17.02.1983 ausgeben. Guck dir dazu mal die Format-Strings auf der MSDN-Seite an.
    Damit kannst du dann auch in der Datenbank vergleichen.
     
    "Wenn Sie mich suchen, ich halte mich in der Nähe des Wahnsinns auf, genauer gesagt auf der schmalen Linie zwischen Wahnsinn und Panik, gleich um die Ecke von Todesangst, nicht weit weg von Irrwitz und Idiotie!"
    -- Bernd das Brot

  13. #13
    elekk11 Tutorials.de Gastzugang
    Hallo,

    das dachte ich auch, weil im INSERT in die Datenbank schneidet er die 00:00:00 Uhrzeit auch ab.
    Aber in der WHERE Klausel beim UPDATE der Tabelle scheinbar nicht, aufjedenfall stürzt er mir immer mit der Meldung:

    "Datentypen in Kriterienausdruck unverträglich"

    Das heißt für mich irgendwie das es nicht zusammenpasst.
     

  14. #14
    Mel_One Mel_One ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Ort
    Zürich (Zürich)
    Beiträge
    167
    Hm, du kannst ja nachgucken. Was ist den der Datenbankdatentyp?
     
    "Wenn Sie mich suchen, ich halte mich in der Nähe des Wahnsinns auf, genauer gesagt auf der schmalen Linie zwischen Wahnsinn und Panik, gleich um die Ecke von Todesangst, nicht weit weg von Irrwitz und Idiotie!"
    -- Bernd das Brot

  15. #15
    elekk11 Tutorials.de Gastzugang
    Hallo,

    der Datenbanktyp ist "Datum/Uhrzeit", nicht "Text". Handelt sich übrigens um eine MS Access Datenbank.
    Das heißt wenn ich in C# das DateTime in String konvertiere knallts beim UPDATE der DB genauso, weil "Datum/Uhrzeit" der DB nicht mit dem String zusammenpassen. Ich fasse also zusammen:

    Ein String aus C# geht nicht weils vom Typ nicht mit "Datum/Uhrzeit" der Datenbank zusammenpasst.
    Das DateTime Objekt aus C# geht auch nicht, weil da noch die Uhrzeit dranhängt (auch wenn sie nur 00:00:00 ist) und das passt der Datenbank auch nicht.

    Ich habe jetzt eine andere Lösung gefunden das ich das DateTime Objekt in einen String wandle und diesen dann im UPDATE Befehl für die Datenbank künstlich wieder auf einen "Datum/Uhrzeit" Typ umbiege mit dem die Datenbank was anfangen kann:

    string date = today.ToShortDateString();
    string updateStatement = "UPDATE ZE SET Gehen = '" + today.TimeOfDay + "' WHERE ZE.Datum = #" + date.Substring(0, 2) + "/" + date.Substring(3, 2) + "/" + date.Substring(6, 4) + "#";


    Funktioniert zwar, finde ich aber alles andere als schön. Verstehe nicht wieso es in .NET keine reinen Date Typ gibt
     

Ähnliche Themen

  1. update mit einem case
    Von karni im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 16.07.07, 08:48
  2. Upper Case/Lower Case
    Von EriFo im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 03.02.05, 11:35
  3. Mehrere PDFs in einem
    Von Horusab im Forum ASP
    Antworten: 0
    Letzter Beitrag: 21.04.04, 14:22
  4. case 'char' mit mehr als einem Zeichen
    Von Kimble im Forum C/C++
    Antworten: 23
    Letzter Beitrag: 11.05.03, 19:08
  5. 4 Fälle scrollen in Delphi 6
    Von RedRockeR im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 04.05.03, 12:59