Tage auswerten mit Jahreswechsel?

Peter Arnold

Benutzer
Beiträge
8
Hallo zusammen,
ich muss die Differenz von Tagen ausrechnen, allerdings sol ich hierbei dtvon und dtbis berücksichtigen. Soweit so gut beim Jahreswechsel klappt es nicht? Warum, es müsste im Jahr 2018 15 Tage und im Jahr 2019 1 Tag raus kommen (01.01.2019).. kann mir jemand helfen wo ich den Fehler habe?? Vielen Dank

select
year(ada.dtbis) 'Jahr',replicate('0', 7-LEN(a.LANR)) + convert(varchar(7), a.LANR) as 'LANR',
a.Suchname,sum(datediff(dd,ada.dtVon,ada.dtBis)) 'Tage-Wunsch',
Case When sum(datediff(dd,ada.dtVon,ada.dtBis)) >= '42' Then 'Prüfen' else 'OK' End as 'Prüfung'

from ada, a
where A.AI = ada.AI
and year(ada.dtbis) > 2017

and ada.AI like '134786'
group by Year (ada.dtbis), a.LANR,a.Suchname

Danke Grüße

Peter
 
Werbung:
Hallo,
nein das ist ein normales Datumsfeld das Problem ist der Jahreswechsel, ich habe Wunschtage dtvon 22.12.2018 dtbis 01.01.2019 nun will ich wissen wie viel Tage liegen davon in 2018 und wie viel in 2019 die Lösung muss also sein 2018 = 9 und 2019 = 1 des SQL sagt mir aber nur 2018 = 10 :-( ... da liegt mein Problem

Danke und Grüße

Peter
 
schnellschuß, aber mit PostgreSQL:

Code:
test=*# select extract('year' from x.x), count(1) from generate_series('2018-12-22'::date,'2019-01-01'::date, '1day'::interval) x group by 1 order by 1;
 date_part | count
-----------+-------
  2018 |  10
  2019 |  1
(2 Zeilen)

ermittle alle möglichen Datumswerte, ermittle daraus das Jahr, und zähle das. PG hat dafür nette Funktionen, z.B. generate_series().
 
group by jahr, würde ich mal so raten?

Codes aus dem PostgreSQL:

Tabelle erstellen:
Code:
create table dates(dates date);

Werte einfügen:
Code:
insert into dates(dates) values ('2018-01-01');
insert into dates(dates) values('2019-01-01');

Abfragen:
Code:
select count(dates) from dates group by extract(year from(dates))

Ergebniss:
1
1

;)

EDIT:
Um das Ganze ein wenig mit mehr als 1 pro Jahr zu machen:
Code:
insert into dates(dates) values ('2019-01-01');
select count(dates) from dates group by extract(year from(dates))
Kommen 2 Datensätze raus, einer mit 2, der andere mit 1.

EDIT2:
Habe mir den Hauptpost nicht wirklich durchgelesen, aber glaube erkannt zu haben, dass du eine Where Klausel darin hast, die ist garnicht nötig ;)

EDIT3:
In meinen Codes auch keine PostgreSQL-Funktionen verwendet, denke ich :/
 
Zuletzt bearbeitet:
Ich verzweifel noch.. also irgendwie kommt er mit dem extract nicht zurecht? Das Datum ist eigentlich ganz normal also bräuchte ich doch keine zusätzliche Tabelle oder?

Group by extract (Year (ada.dtbis)),

Meldung 195, Ebene 15, Status 10, Zeile 34
'extract' wird nicht als Name einer integrierten Funktion erkannt.

Danke
Grüße
Peter
 
extract scheint dann auch eine bei PostgreSQL eingebaute Funktion zu sein.

Die selektiert eigentlich nur das Jahr aus einem Datum, wüsstest du irgendeine Art, wie man das Jahr aus einem Datum ziehen kann?
Wenn ja, dann probiers mal mit der Funktion ;)

Meine erste Idee wäre, aber auch bei PostgreSQL, die to_char-Funktion, wobei du dann mit einem Text arbeiten würdest.

Probier mal:
Code:
select count(dates) from dates group by to_char(dates, 'YYYYY');

Die restlichen Codes sind weitergeführt von meinem vorigen post ;)

EDIT: Soweit ich weiß, sollte man die to_char-Funktion aber nur bei selects verwenden, nicht um einen Wert zwangshaft in eine Spalte zu bekommen. (Denke ich xD)
Bei PostgreSQL gibt es eigene spezifische Funktionen, die wiederum in der Lage sind aus einem Text-Wert einen entsprechenden Datums-Wert zu machen.
 
to_char (ein Strich, der am boden ist), ist nicht Oracle.

to_char, ist eine funktion, die in der Lage ist, einen Wert aus einer Spalte in das Format Text umzuwandeln, weil ein text-feld ein jedes beliebige zeichen enthalten kann.

gibt es auch in postgresql zum Beispiel ;)
 
so what... irgendwo ist der Wurm in dem Datum er erkennt das zusammenhängende Datum irgenwie falsch oder interpretiert es falsch.. normal sollte er 2018 und 2019 doch unterscheiden können? Wenn ich ein Ergebnis habe so poste ich es hier .... Danke trotzdem für die bisherige Hilfe und vielleicht weis ja doch noch ein MS-SQL Freak weiter?
 
Hallo,

also anstelle von "extract..." wäre in T-SQL "YEAR(deine column)" die richtige wahl :)

@Peter Arnold : Interessant wären, zumindest für mich, mehr Infos. Allein dein Statement und die Aussage es müsste das und dies raus kommen, aber es kommt nicht raus... ist naja eher wage :)

Viele Grüße
 
@Chuky666 : Danke, ich versuche es mal zum Beschreiben... es dürfen pro Jahr nur 42 Tage Wunsch abgeben werden, diese werden Online erfasst (vom user) dabei aber "leider" noch nicht gerpüft (kommt noch). So jetzt muss ich eigentlich nur ermitteln wer hat im Jahr wie vile Tage eingetragen.

Die Felder sind als Datum hinterlegt in der SQL-Datenbank dtvon und dtbis. So in einem ersten Schritt ermittle ich alle Datumsbereiche welche eingegeben wurden und zähle die Tage, sind diese zusammen größer wie 42 will ich eine Meldung mit Prüfung haben... das klappt:

DATEDIFF ( DAY , ada.dtVon , ada.dtBis ) as 'Anzahl Tage',
Case When sum(datediff(dd,ada.dtVon,ada.dtBis)) >= '42' Then 'Prüfen' else 'OK' End as 'Prüfung'
Problem ist nun wenn jemand eben vom 22.12.2018 bis 01.01.2019 einträgt so möchte ich gerne den CUT am Jahresende haben, sprich es sind nur 9 Tage in 2018 und 1 Tag in 2019

Soweit verständlich?? es geht also nur um die zwei Datumsfelder von und bis

Danke und Grüße
Peter
 
Das "Group BY YEAR(deine spalte)" hilft da nicht? Dazu kommt noch das in deiner WHERE-Klausel das "ada.AI like '134786' " so keinen Sinn macht, so wie es da ist kannst du auch "ada.AI = '134786' " schreiben.

Zeig doch mal deine Query wie sie jetzt ist und wie dein Ergebnis aussieht.
 
Werbung:
Kann doch nicht so schwer sein ...

Es sind übrigens 10 Tage in 2018: 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., und es kommt drauf an, ob die Grenzen bei Dir inklusive oder exclusive sein sollen.

Wenn Du wissen willst, welche Tage vom 22.12.2018 bis 31.1.2019 alles in 2018 sind, ziehst einfach vm bereich 2018 den sich überlappenden Bereich ab. Vielleicht hat hat M$SQL dazu passende Funktionen wie z.B. PG:

Code:
test=*# with r as (select '[2018-01-01,2019-01-01)'::daterange * '[2018-12-22,2019-01-31)' as r) select upper(r.r) - lower(r.r) from r;
 ?column?
----------
  10
(1 Zeile)

ansonsten mußt halt einfach bisschen Kalenderrechnung betreiben. Ich hab kein M$SQL, kann es Dir daher nicht vormachen.
 
Zurück
Oben