ändern - sql time format hh mm




Erstellen Sie ein Datum mit T-SQL (10)

Ich versuche, ein Datum mit einzelnen Teilen wie 12, 1, 2007 in eine Datetime in SQL Server 2005 zu konvertieren. Ich habe Folgendes versucht:

CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)

Dies führt jedoch zu einem falschen Datum. Was ist die richtige Methode, um die drei Datumswerte in ein korrektes Datetime-Format umzuwandeln?


Angenommen, y, m, d sind alle int , wie wäre es mit:

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)

Bitte lesen Sie meine andere Antwort für SQL Server 2012 und höher


Es ist sicherer und sauberer, einen expliziten Startpunkt "19000101" zu verwenden

create function dbo.fnDateTime2FromParts(@Year int, @Month int, @Day int, @Hour int, @Minute int, @Second int, @Nanosecond int)
returns datetime2
as
begin
    -- Note! SQL Server 2012 includes datetime2fromparts() function
    declare @output datetime2 = '19000101'
    set @output = dateadd(year      , @Year - 1900  , @output)
    set @output = dateadd(month     , @Month - 1    , @output)
    set @output = dateadd(day       , @Day - 1      , @output)
    set @output = dateadd(hour      , @Hour         , @output)
    set @output = dateadd(minute    , @Minute       , @output)
    set @output = dateadd(second    , @Second       , @output)
    set @output = dateadd(ns        , @Nanosecond   , @output)
    return @output
end

Ich füge eine Ein-Zeilen-Lösung hinzu, wenn Sie eine Datums- und Uhrzeitangabe benötigen:

select dateadd(month, (@Year -1900)*12 + @Month -1, @DayOfMonth -1) + dateadd(ss, @Hour*3600 + @Minute*60 + @Second, 0) + dateadd(ms, @Millisecond, 0)

Ich persönlich bevorzuge Substring, da es Bereinigungsoptionen und die Möglichkeit bietet, die Zeichenfolge nach Bedarf aufzuteilen. Die Annahme ist, dass die Daten das Format 'dd, mm, yyyy' haben.

--2012 and above
SELECT CONCAT (
        RIGHT(REPLACE(@date, ' ', ''), 4)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5)),2)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1)),2)
        )

--2008 and below
SELECT   RIGHT(REPLACE(@date, ' ', ''), 4)
        +'-'
        +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5),2)
        +'-'
        +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1),2)

Hier ist eine Demonstration, wie es verklagt werden kann, wenn die Daten in einer Spalte gespeichert sind. Unnötig zu sagen, dass es ideal ist, das Ergebnis zu überprüfen, bevor es auf die Spalte angewendet wird

DECLARE @Table TABLE (ID INT IDENTITY(1000,1), DateString VARCHAR(50), DateColumn DATE)

INSERT INTO @Table
SELECT'12, 1, 2007',NULL
UNION
SELECT'15,3, 2007',NULL
UNION
SELECT'18, 11 , 2007',NULL
UNION
SELECT'22 , 11, 2007',NULL
UNION
SELECT'30, 12, 2007  ',NULL

UPDATE @Table
SET DateColumn = CONCAT (
        RIGHT(REPLACE(DateString, ' ', ''), 4)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), CHARINDEX(',', REPLACE(DateString, ' ', '')) + 1, LEN(REPLACE(DateString, ' ', '')) - CHARINDEX(',', REPLACE(DateString, ' ', '')) - 5)),2)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), 1, CHARINDEX(',', REPLACE(DateString, ' ', '')) - 1)),2)
        ) 

SELECT ID,DateString,DateColumn
FROM @Table

SQL Server 2012 hat eine wunderbare und lang erwartete neue Funktion von DATENFROMPARTS (die einen Fehler auslösen wird, wenn das Datum ungültig ist - mein Haupteinwand gegen eine DATEADD-basierte Lösung für dieses Problem):

http://msdn.microsoft.com/en-us/library/hh213228.aspx

DATEFROMPARTS(ycolumn, mcolumn, dcolumn)

oder

DATEFROMPARTS(@y, @m, @d)

Sie können auch verwenden

select DATEFROMPARTS(year, month, day) as ColDate, Col2, Col3 
From MyTable Where DATEFROMPARTS(year, month, day) Between @DateIni and @DateEnd

Funktioniert in SQL seit ver.2012 und AzureSQL


Versuche dies:

Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
Declare @Month TinyInt Set @Month = 6
Declare @Year Integer Set @Year = 2006
-- ------------------------------------
Select DateAdd(day, @DayOfMonth - 1, 
          DateAdd(month, @Month - 1, 
              DateAdd(Year, @Year-1900, 0)))

Es funktioniert auch, hat den Vorteil, keine String-Konvertierungen zu machen, so ist es reine arithmetische Verarbeitung (sehr schnell) und es ist nicht abhängig von einem Datumsformat Dies nutzt aus der Tatsache, dass SQL Server interne Darstellung für datetime und smalldatetime Werte ist ein zwei Teilwert, dessen erster Teil eine Ganzzahl ist, die die Anzahl der Tage seit dem 1. Januar 1900 darstellt, und der zweite Teil ist ein Dezimalbruch, der den Bruchteil eines Tages (für die Zeit) darstellt --- also der ganzzahlige Wert 0 (null ) übersetzt immer direkt in Mitternacht am 1. Januar 1900 ...

oder, dank dem Vorschlag von @brinary,

Select DateAdd(yy, @Year-1900,  
       DateAdd(m,  @Month - 1, @DayOfMonth - 1)) 

Bearbeitet Oktober 2014. Wie von @cade Roux bemerkt, hat SQL 2012 jetzt eine eingebaute Funktion:
DATEFROMPARTS(year, month, day)
Das macht das Gleiche.

Bearbeitet am 3. Oktober 2016, (Danke an @bambams für das Bemerken, und @brinary für das Reparieren), Die letzte Lösung, vorgeschlagen von @brinary. scheint nicht für Schaltjahre zu funktionieren, es sei denn, die Addition von Jahren wird zuerst durchgeführt

select dateadd(month, @Month - 1, 
     dateadd(year, @Year-1900, @DayOfMonth - 1)); 

Versuchen

CAST(STR(DATEPART(year, DATE))+'-'+ STR(DATEPART(month, DATE)) +'-'+ STR(DATEPART(day, DATE)) AS DATETIME)

Versuchen Sie diese Abfrage:

    SELECT SUBSTRING(CONVERT(VARCHAR,JOINGDATE,103),7,4)AS
    YEAR,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),1,2)AS
MONTH,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),4,3)AS DATE FROM EMPLOYEE1

Ergebnis:

2014    Ja    1
2015    Ja    1
2014    Ja    1
2015    Ja    1
2012    Ja    1
2010    Ja    1
2015    Ja    1

Wenn Sie keine Fäden daraus ziehen wollen, funktioniert das auch (Stellen Sie es in eine Funktion):

DECLARE @Day int, @Month int, @Year int
SELECT @Day = 1, @Month = 2, @Year = 2008

SELECT DateAdd(dd, @Day-1, DateAdd(mm, @Month -1, DateAdd(yy, @Year - 2000, '20000101')))




tsql