Announcement

Collapse
No announcement yet.

datediff()

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • datediff()

    Hallo, ich möchte
    Alle Mitarbeiter, die älter sind als 50 Jahre (zum akt. Tag)
    aus der Tabelle "HumanResources.Employee" auslesen.

    Mein ursprünglicher Code:

    Code:
    select BirthDate
    From HumanResources.Employee
    where datediff(year,BirthDate,getdate()) >= 50;
    Das funktioniert aber nicht so recht, da er mir auch Mitarbeiter anzeigt, die 49 Jahre alt sind.
    Nun habe ich es so erschlagen, was aber nicht gerade elegant ist:

    Code:
    select BirthDate
    From HumanResources.Employee
    Where ((year(getdate() - BirthDate) - 1900) >= 50);
    Kennt jemand eine bessere Lösung?

    Und kann mir noch jemand sagen wie man aus einem datetime "nur das Datum" oder "nur die Zeit" extrahieren kann - ohne in eine Zeichekette zu konvertieren?

    Gruß SNMP

  • #2
    Hallo,

    Code:
    select BirthDate
    From HumanResources.Employee
    where datediff(year,BirthDate,getdate()) >= 50;
    Das kann nicht so funktionieren wie du dir das wünscht, da du hier ja nur die Jahre vergleichst. Sprich er gibt dir auch die Mitarbeiter an, die dieses Jahr noch 50 Jahre alt werden. Daher denke ich, das es mit der Datediff Funktion nur komplizierter würde als mit deiner momentanen Funktion.

    Aus dem datetime bekommst du mithilfe der datepart Funktion die Tage, Monate, usw. extrahiert...
    Du musst dir dann alles wieder als String zusammenbauen (jedenfalls soweit ich weiß ^^)
    Sprich:
    Code:
    select cast(datepart(hh,getdate())as varchar) + ':' +
    cast(datepart(mi,getdate())as varchar) + ':' + 
    cast(datepart(s,getdate())as varchar)
    Ist zwar nicht schön, dafür aber selten :-)
    Gruß Sascha

    Comment


    • #3
      Wenn du alle willst, die 50 und älter sind, ginge auch ein

      select BirthDate From HumanResources.Employee where dateadd(yy,50,Birthdate) <= getdate()

      Dabei wäre aber jemand, der sein Datum mit Zeit 14:00 eingetragen hat, bei einer Abfrage um 13:00 noch nicht dabei, um 15:00 aber schon. Sollte also ein eventueller Zeitanteil in Birthdate berücksichtigt werden, dann sieht es etwa so aus:

      select BirthDate From HumanResources.Employee where
      dateadd(yy,50,Birthdate) < cast(floor(cast(getdate() as float)) + 1 as datetime)

      Hier nicht mehr kleiner gleich, nur mehr "kleiner als Folgetag 0:00 Uhr" vergleichen! Und auch nicht INTEGER zum casten verwenden, da integer nach 12:00 aufrundet, auf der sicheren Seite ist man also nur, wenn man einen Float macht und den Nachkommateil abschneidet.

      bye,
      Helmut

      Comment


      • #4
        Das ist auf alle Fälle eine bessere Lösung.
        Vielen Dank
        Gruß SNMP

        Comment

        Working...
        X