inf1d3l
Goto Top

MS SQL: Varchar zu Datum im Select

Hallo,

ich habe eine Spalte in einer MS SQL Datebank, die den Typ Varchar hat und Datumsangaben im Format yyyymmddhhmmss enthält. Ich möchte schon beim Select ein Datum dd.mm.yyyyy daraus machen. Ein SQL-Pro hier, der das aus dem Kopf kann?

Merci

Content-ID: 2703222725

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

Ausgedruckt am: 05.11.2024 um 23:11 Uhr

em-pie
Lösung em-pie 06.05.2022 um 10:16:06 Uhr
Goto Top
Moin,

die Holzhammer-Methode wäre:
DECLARE @dt as nvarchar(24)
select @dt = '20220505101010'  

SELECT @dt
  , LEFT(@dt, 8)
  , RIGHT(@dt, 6)

  , TAG = CONCAT(RIGHT(LEFT(@dt, 8), 2), '.'  
      , RIGHT(LEFT(@dt, 6), 2), '.'  
      , LEFT(@dt, 4))
  , UHRZEIT = CONCAT(LEFT(RIGHT(@dt, 6), 2), ':'  
      , LEFT(RIGHT(@dt, 4), 2), ':'  
      , RIGHT(@dt, 2))

packe das in eine UDF und du hast es mit mehr comfort

Gruß
em-pie
colinardo
Lösung colinardo 06.05.2022 aktualisiert um 11:00:22 Uhr
Goto Top
Und wenn die neue Spalte stattdessen ein echtes Datum als Typ haben soll,
SELECT Convert(DATE,left(spalte,8)) as Datum
FROM mytable;
davon lässt sich ja dann bei Bedarf leicht eine formatierte Variante(dd.mm.yyyy) ableiten
SELECT Convert(nvarchar,Convert(DATE,left(spalte,8)),104) as Datum
FROM mytable;

https://docs.microsoft.com/de-de/sql/t-sql/functions/date-and-time-data- ...
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2005/m ...

Grüße Uwe
ukulele-7
Lösung ukulele-7 06.05.2022 um 11:08:25 Uhr
Goto Top
Für Datum + Zeit:
SELECT convert(DATETIME,stuff(stuff(stuff('20220505101010',9,0,' '),12,0,':'),15,0,':'))  
Inf1d3l
Inf1d3l 06.05.2022 um 11:11:39 Uhr
Goto Top
Ich habe nur Lesezugriff, habe ich vergessen zu erwähnen. Danke euch! Wie immer top!
em-pie
em-pie 06.05.2022 aktualisiert um 11:43:21 Uhr
Goto Top
Und für andere, die eine KOnvertierung häufiger, auch in anderen Selects benötigen, hier eine mögliche UDF

CREATE FUNCTION [dbo].[udf_ConvertDate] (
   @strDT as nvarchar(16)
)

RETURNS TABLE
as RETURN

SELECT
  [INPUT] = @strDT
  , [DATE] = Convert(DATE,left(@strDT,8))
  , [TIME] = CONVERT(TIME, (LEFT(RIGHT(@strDT, 6), 2) + ':'  
      + LEFT(RIGHT(@strDT, 4), 2) +  ':'  
      + RIGHT(@strDT, 2)))
  , [DATETIME] = CONVERT(DATETIME, CONCAT(left(@strDT,8), ' '   
      , (LEFT(RIGHT(@strDT, 6), 2), ':'  
      , LEFT(RIGHT(@strDT, 4), 2),  ':'  
      , RIGHT(@strDT, 2))))

Die Abfrage sähe dann so aus:

 select * from dbo.udf_ConvertDate('20220505101112')  
mit dem Ergebnis:
INPUT           DATE            TIME                    DATETIME
20220505101112	2022-05-05	10:11:12.0000000	2022-05-05 10:11:12.000



Und kann in der eigentlichen Abfrage so genutzt werden:
SELECT
 Col1
, Col2
, myTable.SpalteMitDatum
, DATUM = (select [DATE] from dbo.udf_ConvertDate(myTable.SpalteMitDatum))
FROM myTable