dondy
Goto Top

Zahlen in Datum umwandeln in Tabelle

Hallo zusammen,

ich lasse eine Tabelle über eine TXT-Datei befüllen, in der es zwei Datumsfelder gibt. Leider hat das Datum in der TXT-Datei folgendes Format: 771203.
Mit welchem Statement kann ich den Zahlenwert in der Tabelle wie folgt umwandeln?

771203 --> 03.12.1977

Ich verwenden einen SQL2005 Standard Server. Ich kann auf dem System leider nicht mit anderen Mitteln als mit SQL-Statements arbeiten.

Kennt jemand eine Lösung?
Kommentar vom Moderator Biber am Mar 19, 2010 um 12:33:31 Uhr
Auf "Erledigt" gesetzt.

Content-Key: 138465

Url: https://administrator.de/contentid/138465

Printed on: April 23, 2024 at 07:04 o'clock

Member: Biber
Biber Mar 17, 2010 at 12:59:34 (UTC)
Goto Top
Moin dondy,

habe deine Anforderung nur teilweise verstanden.
Deshalb die Nachfragen:

  • ich gehe hoffentlich fehl in der Annahme, dass du die Übernahme der beiden YYMMDD-Zeichenfelder aus der Textdatei in die DB-Tabelle beibehalten willst und redundant die Werte nochmals in derselben Tabelle alls Datumswert speichern willst?
  • deshalb die Anschlussfrage: willst du also das Ganze beim Import glattziehen - if so, wie heißen Quelle, Zieltabelle, Felder, Import-Statement...?
  • Wenn aber Import-Mimik unangetastet bleiben soll/muss, also nur ein View zusammengeschrotet werden soll: wie heißen Tabelle, Felder...?

Grüße
Biber
Member: dondy
dondy Mar 17, 2010 at 13:07:22 (UTC)
Goto Top
Hi Biber,

die TXT-Datei wird so wie sie ist in eine Tabelle gepackt, ohne Umwandlung. Von dieser Tabelle soll es dann in eine weitere Tabelle gehen. Die Umwandlung soll beim Import in die zweite Tabelle erfolgen.
Der Grund für die erste Tabelle ist, dass ein anderes Programm genau diese Tabelle benötigt und deshalb die Daten "redundant" vorliegen.

Ich stelle mir irgendwie sowas vor:

select datum from tabelle1
into tabelle2
convert datum 771203 --> 03.12.1977
Member: it-frosch
it-frosch Mar 17, 2010 at 13:08:30 (UTC)
Goto Top
Hallo dondy,

"."links(datum,5,2)".19"

Du musst die Idee aber noch in die richtige Syntax umbauen.
Member: dondy
dondy Mar 17, 2010 at 13:53:55 (UTC)
Goto Top
Hallo,

ja genau sowas habe ich gesucht, es funktioniert auch, fast.
Wie kann ich den funktionen right und left sage, dass sie nicht die zeichen 0 bis 6 nehmen sollen, sondern zum beispiel die zahlen an stelle 5 UND 6?
Member: Biber
Biber Mar 17, 2010 at 14:16:41 (UTC)
Goto Top
Moin dondy,

Zitat von @dondy:
Wie kann ich den funktionen right und left sage, dass sie nicht die zeichen 0 bis 6 nehmen sollen, sondern zum beispiel die zahlen an stelle 5 UND 6?
Dafür wiederum wäre die skalare Funktion SUBSTRING bei M$-SQL zuständig.
Eigentlich SUBSTRING(ausgangs_string [FROM start_position] [FOR laenge])
aber im täglichen Gebrauch meist angedeutet als SUBSTRING( ausgangs_string, start_position, laenge)

--> in deinem Fall also SUBSTRING(datum, 5, 2).

Grüße
Biber
Member: MadMax
MadMax Mar 18, 2010 at 08:43:41 (UTC)
Goto Top
Moin,

machen wir es doch nicht so kompliziert und nehmen einfach Datumskonvertierungen:
select convert (varchar, convert (datetime, '771203', 12), 104)  

Kleiner Nachtrag: läßt man das äußere convert weg, hat man auch das Format, in dem man sowas normal ablegt, datetime face-wink

Gruß, Mad Max
Member: Biber
Biber Mar 18, 2010 at 18:41:20 (UTC)
Goto Top
Na ja, Mad Max,

schon richtig, aber...
zwei Unwägbarkeiten dabei.
Erstens hast du bzw. dondy ja noch eine Konvertierung mehr - denn dieses Drexdatum liegt ja als "Zahl" vor, nicht als varchar().

Zweitens (aus meiner Sicht versteckter und deshalb gefährlicher).
Dieses verbotenerweise mit 2stelligen Jahreszahlen gespeicherte Datum hat eventuell ja irgendwelche internen Regeln und Konventionen, ab wann denn eine Jahreszahl wie in dem Beispiel "77" als "Jahr 1977" oder "Jahr 2077" interpretiert werden soll.

Mit einer Substring/Concat-Mimik kannst du das abbilden.... jeweils an der gleichen Sollbruchstelle eben eine "19" oder "20" als Jahrhundertwert davorschreiben.

Wenn du Convert(..6stelligeDatumsentsprechung...zu Datum TT.MM.JJJJ) aufrufst, dann wird die Sollbruchstelle von MSSQL genommen.

Sollte dondy wenigstens vorher wissen... der sucht sich sonst albern bei Dateninkonsistenzen.

@dondy
Ich bin immer wieder aufs Neue verblüfft, dass heute, Anno 2010, immer noch datenliefernde Systemchen unterwegs sind, die Datumswerte ohne Jahrhundertangaben exportieren.

Gab es nicht damals, vor 11 Jahren, diese Y2K-Zertifierung unter gar keinen Umständen für solchen Pfusch?

Grüße
Biber
Member: MadMax
MadMax Mar 19, 2010 at 08:24:36 (UTC)
Goto Top
Moinmoin,

Zitat von @Biber:
Erstens hast du bzw. dondy ja noch eine Konvertierung mehr - denn dieses Drexdatum liegt ja als "Zahl" vor, nicht als
varchar().
Wenn ich das richtig gelesen habe, kommt das Ganze aus einer Textdatei, müßte deshalb erstmal als Text vorliegen. Wenn nicht, wird '771203' (bzw. die Variable/Spalte) einfach durch convert (varchar, 771203) ersetzt.

Zitat von @Biber:
Zweitens (aus meiner Sicht versteckter und deshalb gefährlicher).
Dieses verbotenerweise mit 2stelligen Jahreszahlen gespeicherte Datum hat eventuell ja irgendwelche internen Regeln und
Konventionen, ab wann denn eine Jahreszahl wie in dem Beispiel "77" als "Jahr 1977" oder "Jahr 2077"
interpretiert werden soll.
Da hast Du natürlich recht, aber das ist ja erstmal ein Problem der zweistelligen Jahreszahlen. Bei SQL Server geht der Bereich standardmäßig von 1950 - 2049. Das kann man ggf. mit dateadd (yy, 100, <Datum>) bzw. dateadd (yy, -100, <Datum>) korrigieren. Oder noch geschickter, man ändert diesen Bereich durch:
exec sp_configure 'show advanced options', 1  
reconfigure
exec sp_configure 'two digit year cutoff', <Jahr>	-- <Jahr> = letztes Jahr des 100-Jahres-Bereichs, also z.B. 2029 fuer 1930 - 2029  
exec sp_configure 'show advanced options', 0  
reconfigure

Aber da sich dondy ja nicht mehr rührt, scheint sein Problem wohl eh erledigt zu sein.

Gruß, Mad Max
Member: Biber
Biber Mar 19, 2010 at 10:43:55 (UTC)
Goto Top
Moin Mad Max,

Zitat von @MadMax:
Moinmoin,

> Zitat von @Biber:
> ----
> Erstens hast du bzw. dondy ja noch eine Konvertierung mehr - denn dieses Drexdatum liegt ja als "Zahl" vor, nicht als varchar().
Wenn ich das richtig gelesen habe, kommt das Ganze aus einer Textdatei, müßte deshalb erstmal als Text vorliegen.
Sagen wir so - vielleicht ist es besser, lieber gar nicht so genau den ganzen Ablauf zu hinterfragen... face-wink
Wenn ich es richtig gelesen haben, dreht er noch eine Extra-Schleife "die TXT-Datei wird so wie sie ist in eine Tabelle gepackt, ohne Umwandlung".
Wobei dieses "ohne Umwandlung" aber im weiteren Beitragsverlauf zu bedeuten scheint, dass dieses 6stellige Datumskrams als Zahl vorliegt.

Aber da sich dondy ja nicht mehr rührt, scheint sein Problem wohl eh erledigt zu sein.
Hmmja, ist mir auch nicht entgangen, dass er ein wenig stiller geworden ist in letzter Zeit.
Andererseits fände ich es viel zu schade, diesen Beitrag wegen fehlender Rückmeldung in die Tonne zu kloppen.
Soll ich mal einfach einen Erledigt-Haken dransetzen? *grübel* [Edit] nach kurzer Bedenkzeit getan. [/Edit]

Gruß, Mad Max
Grüße zurück
Biber
Member: MadMax
MadMax Mar 19, 2010 at 11:35:53 (UTC)
Goto Top
Keine Rückmeldung ist ja auch eine Art Rückmeldung. Insofern wäre das Problem wohl gelöst. Anregungen bzw. Anleitungen, wie es geht, stehen jedenfalls gleich mehrere hier.

Schönes Wochenende,
Mad Max
Member: it-frosch
it-frosch Mar 19, 2010 at 18:34:01 (UTC)
Goto Top
@Biber
@mad Max

danke euch beiden für die schönen Anregungen zu dem Thema.
Genau deshalb lese ich hier. face-smile

Schönes WE noch.