Datum + Wochentag in Tabelle einfügen

Oracle 10 g. PL /SQL

Hey!

Ich suche einen Code mit dessen Hilfe Daten und dazugehörige Wochentag in eine Tabelle schreiben lassen kann.
Das heißt der User gibt z.B. 01.01.2007 ein und die restlichen Daten des Jahres werden in die Spalte „Datum“ und die dazugehörigen Wochentage in die Spalte „Tage“ geschrieben.

Ich hab sowas mal versucht, aber das ist nicht so wie ich es brauche und nebenbei funktioniert es auch nicht.

PROCEDURE MONATNEU (B6 VARCHAR2 DEFAULT ‚nicht speichern‘,
IN_TAG VARCHAR2 DEFAULT NULL,
IN_MONATNEU VARCHAR2 DEFAULT NULL,
IN_JAHR VARCHAR2 DEFAULT NULL)

IS

BEGIN
Starte;
HTP.P (’’);
HTP.P(’’);
HTP.P(’

Hier können Sie einen neuen Monat anlegen.

Geben Sie den Monat als Datum (Bsp.:01.01.2006)

ein und klicken dann auf Speichern.

‚);
HTP.P(‘’);
HTP.P(’’);

IF (B6 = ‚Speichern‘) THEN
LOOP
INSERT INTO T_LOTTO_DATEN (ZAHL1,ZAHL2,ZAHL3)
VALUES (IN_TAG+1,IN_MONATNEU,IN_JAHR);
EXIT WHEN IN_TAG >= ‚31‘;
END LOOP;

HTP.P(’

Ihre Daten wurden gespeichert!’);

END IF;
HTP.P(’

Hi,

warum willst Du dass?
Du kannst jederzeit die Infos aus dem Datum selektieren.

In Oracle/PLSQL, the to_date function converts a string to a date.

The syntax for the to_date function is:

to_date( string1, [format_mask], [nls_language] )

string1 is the string that will be converted to a date.

format_mask is optional. This is the format that will be used to convert string1 to a date.

nls_language is optional. This is the nls language used to convert string1 to a date.

The following is a list of options for the format_mask parameter. These parameters can be used in many combinations.

Parameter Explanation
YEAR Year, spelled out
YYYY 4-digit year
YYY
YY
Y Last 3, 2, or 1 digit(s) of year.
IYY
IY
I Last 3, 2, or 1 digit(s) of ISO year.
IYYY 4-digit year based on the ISO standard
RRRR Accepts a 2-digit year and returns a 4-digit year.
A value between 0-49 will return a 20xx year.
A value between 50-99 will return a 19xx year.
Q Quarter of year (1, 2, 3, 4; JAN-MAR = 1).
MM Month (01-12; JAN = 01).
MON Abbreviated name of month.
MONTH Name of month, padded with blanks to length of 9 characters.
RM Roman numeral month (I-XII; JAN = I).
WW Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
W Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.
IW Week of year (1-52 or 1-53) based on the ISO standard.
D Day of week (1-7).
DAY Name of day.
DD Day of month (1-31).
DDD Day of year (1-366).
DY Abbreviated name of day.
J Julian day; the number of days since January 1, 4712 BC.
HH Hour of day (1-12).
HH12 Hour of day (1-12).
HH24 Hour of day (0-23).
MI Minute (0-59).
SS Second (0-59).
SSSSS Seconds past midnight (0-86399).
FF Fractional seconds. Use a value from 1 to 9 after FF to indicate the number of digits in the fractional seconds. For example, ‚FF4‘.
AM, A.M., PM, or P.M. Meridian indicator
AD or A.D AD indicator
BC or B.C. BC indicator
TZD Daylight savings information. For example, ‚PST‘
TZH Time zone hour.
TZM Time zone minute.
TZR Time zone region.

For example:

to_date(‚2003/07/09‘, ‚yyyy/mm/dd‘) would return a date value of July 9, 2003.
to_date(‚070903‘, ‚MMDDYY‘) would return a date value of July 9, 2003.
to_date(‚20020315‘, ‚yyyymmdd‘) would return a date value of Mar 15, 2002.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hey!
Also ich brauch das, damit man sich auch schon im Januar angucken kann was am 5.6.2007 ist.
Zu jedem Datum soll eine Information hinterlegt werden und daher brauch ich alle Daten in der Tabelle.Die Information ist auch vom dem Wochentag abhängig.
Noch ein Grund dafür ist das ich nicht jedes Datum einzeln eintragen will.

Als Beispiel
Datum Tag Info
01.01.2007 Montag 16
02.01.2007 Dienstag 17

So soll das dann aussehen, nur halt für das ganze Jahr

Hm das wäre sowas ähnliches wie ein Kalender.

Also in dem geposteten Code stand mir zu viel HTML Code … willst du eine Datenbank Tabelle? oder eine HTML Tabelle? Wenn letzteres bist du im falschen Forum :smile:

Im ersten Fall gibt es verschiedene Varianten, wie man das bewerkstelligen kann, je nach dem was deine genauen Anforderungen sind.

a) Du legst eine View an, die in etwa so aussieht:

create view table\_plus\_date\_info as 
select spalte\_a, ... , datum, to\_char(datum, 'DAY') Wochentag, to\_char(datum, 'Q') from my\_table

b) Du erzeugst eine Tabelle die diese Daten für einen Datumsbereich beeinhaltet:

create table as 
select sysdate+rownum, to\_char(sysdate+rownum, 'DAY') ... 
from all\_objects 
where rownum 

Hi!

Also ich brauch das, damit man sich auch schon im Januar
angucken kann was am 5.6.2007 ist.

Ich sehe noch immer kein Problem:

select datum,to\_char(datum,'DAY'),der\_andere\_Wert from deine\_tabelle

Zu jedem Datum soll eine Information hinterlegt werden und
daher brauch ich alle Daten in der Tabelle.Die Information ist
auch vom dem Wochentag abhängig.

Inwiefern? Durch Berechnungen? Durch Usereingaben? …

Als Beispiel
Datum Tag Info
01.01.2007 Montag 16
02.01.2007 Dienstag 17

So soll das dann aussehen, nur halt für das ganze Jahr

Prozedur mit einer Datumsvariablen in einer Schleife erhöhen, in die Tabelle schreiben - und am Ende des Jahres aus der Schleife rausspringen … wo liegt das Problem?

Grüße,
Tomh

Prozedur mit einer Datumsvariablen in einer Schleife erhöhen,
in die Tabelle schreiben - und am Ende des Jahres aus der
Schleife rausspringen … wo liegt das Problem?

Morgen!

Genau da liegt das Problem! Meine Schleife läuft nicht richtig. Das Programm hängt sich immer wieder auf. Daher auch mein Code um zu wissen welcher Fehler da ist.

Das das aussieht wie eine HTML Tabelle ist ja klar!
Das ist das was man auf der Oberfläche sieht.Ich dachte das sei klar.

Der User gibt ein 01.01.2007 und klickt auf „erstellen“ nun soll das ganze Jahr mit Wochentagen in der Tabelle abgespeichert werden!Start ist halt der 01.01.2007. Ich weiß auch wie es funktioniert. Ich poste mal meine bei der der dich gestern 5mal aufgehangen hat.

IF (B6 = ‚Speichern‘) THEN
LOOP
INSERT INTO T_LOTTO_DATEN (ZIEHUNGSDATUM)
VALUES (IN_MONAT+1);
END LOOP;

IN_MOANT ist das was der Benutzer als Startdatum eingibt.

Oh hab ganz vergessen:

EXIT WHEN (ZIEHUNGSDATUM = 31.12.2007);

ZIEHUNGSDATUm ist der Name der Tabellen Spalte.

Oh hab ganz vergessen:

EXIT WHEN (ZIEHUNGSDATUM = 31.12.2007);

ZIEHUNGSDATUm ist der Name der Tabellen Spalte.

Und dieses Ziehungsdatum ist eine Variable? Wenn ja dann setzt du die nie und daher bricht deine Schleife nicht ab.

Oder ist es eine Spalte (wie das insert statement nahelegt), dann verstehe ich die exit clausel nicht.

Auch in_monat hat immer den gleichen wert …

IF (B6 = ‚Speichern‘) THEN
WHILE (IN_MONATNEU

IF (B6 = ‚Speichern‘) THEN
WHILE (IN_MONATNEU

SELECT
TO_DATE (A.ZIEHUNGSDATUM),
TO_CHAR (ZIEHUNGSDATUM,‚DAY‘)day
FROM
T_LOTTO_DATEN A,
LOTTO_MONAT B

So okay das klappt mit dem View und den Wochentagen dazu, vielen Dank!
Nun nur noch das Problem wie krieg ich die Daten darein?

Nun nur noch das Problem wie krieg ich die Daten darein?

Was für Daten denn nun noch?

Das Datum.
Ich dachte das ja so das der User den ersten Tag im Jahr eingibt also 01.01.2007 und klickt auf speichern. Dann sollen alle Daten diesen Jahres in einer Tabelle gespeichert werden

…NEUER_MO DATE := IN:MONATNEU;

IF (B6 = ‚Speichern‘) THEN
WHILE (IN_MONATNEU

Sorry, aber was fehlt/funktioniert nicht?
Die Schleife zum erstellen eines Kalenderview oder Tabelle haben wir doch geklärt. Wenn da noch immer Fragen offen sind, solltes du das Problem genaus beschreiben und nicht einfach ‚das funktioniert nicht‘

Jens

NEUER_MO := NEXT_DAY(NEUER_MO ,‚DAY‘);

Oracle Doku:
NEXT_DAY

Syntax

next_day::=
Description of next_day.gif follows
Description of the illustration next_day.gif

Purpose

NEXT_DAY returns the date of the first weekday named by char that is later than the date date. The return type is always DATE, regardless of the datatype of date. The argument char must be a day of the week in the date language of your session, either the full name or the abbreviation. The minimum number of letters required is the number of letters in the abbreviated version. Any characters immediately following the valid abbreviation are ignored. The return value has the same hours, minutes, and seconds component as the argument date.

Examples

This example returns the date of the next Tuesday after February 2, 2001:

SELECT NEXT_DAY(‚02-FEB-2001‘,‚TUESDAY‘) „NEXT DAY“
FROM DUAL;

NEXT DAY

06-FEB-2001


was du brauchst ist NEUER_MO := NEUER_MO +1

Hallo Jens,

NEXT_DAY

Die grauenhafteste Funktion, die es in PL/SQL gibt (aber immer noch besser als zu Fuß. Netterweise ist die nämlich - wenn man sie so verwendet, wie im Beispiel angegeben von ca. 87 NLS settings abhängig und funktioniert somit auf ca. 3 % aller Datenbanken. NLS-unabhängig hingeschrieben, muss das in etwa so aussehen:

SELECT NEXT\_DAY(TO\_DATE('02-02-2001','DD-MM-YYYY'),
 RTRIM(TO\_CHAR(TO\_DATE('02-01-2001','DD-MM-YYYY'),'DAY')))
FROM dual;

Ausgesprochen elegant, wie man sieht, wobei sich zugegebenermassen der erste to_date nicht vermeiden lässt, aber den Tag als String zu verlangen kann sich echt nur einer ausdenken, der von NLS noch nie was gehört hat.

Gruß,
Martin *der das wieder einmal loswerden musste*

Hallo Jens,

NEXT_DAY

Die grauenhafteste Funktion, die es in PL/SQL gibt

Na da gibt es im Datumsbereich aber noch ne Menge Konkurrenz :smile:

Ansonsten weiss ich allerdings nicht auf welches Posting du antwortest.

Ich habe jedenfalls NICHT vorgeschlagen NEXT_DAY zu verwenden. Sondern
Datum +1, da ich das letzte Posting des OPs so interpretiert hatte, dass er NEXT_DAY verwendet um ‚den nächsten Tag‘ zu erhalten.

Hallo Jens,

Die grauenhafteste Funktion, die es in PL/SQL gibt

Na da gibt es im Datumsbereich aber noch ne Menge Konkurrenz

)

Bei mir ist NEXT_DAY einsamer Spitzenreiter, aber generell ist NLS mit Sicherheit eine der Hauptschwächen von Oracle (wenn bei uns im Büro einer NLS_LANG sagt, krieg ich immer Schreikrämpfe).

Ansonsten weiss ich allerdings nicht auf welches Posting du
antwortest.

Sorry, war ein Reflex, ich hab’ dein Posting gar nicht so genau gelesen, auch weil mir die ursprüngliche Problemstellung immer noch nicht klar ist. Aber bei NEXT_DAY krieg ich immer das Reissen :wink:

Gruß
Martin

Hey also ich hab nun beides genutzt.
DECLARE
NEUER_MO DATE := IN_MONATNEU;
BEGIN

IF (B6 = ‚Speichern‘) THEN

WHILE (TO_DATE(NEUER_MO)) = TO_DATE(LAST_DAY(NEUER_MO)) LOOP
INSERT INTO T_LOTTO_DATEN (ZIEHUNGSDATUM)
VALUES (IN_MONATNEU);
NEUER_MO := NEXT_DAY(NEUER_MO,‚DD-MM-YYYY‘);
NEUER_MO := NEUER_MO+1;
END LOOP;

END IF;

Wenn ich aber nun auf Speichern klicke wird kein Wert in die Tabelle gespeichert.
Woran könnte das liegen?