Próbuję przekonwertować datę z poszczególnymi częściami, takimi jak 12, 1, 2007, na datę i godzinę w SQL Server 2005. Próbowałem:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
ale powoduje to niewłaściwą datę. Jaki jest prawidłowy sposób przekształcenia trzech wartości daty we właściwy format daty i godziny.
sql
sql-server
sql-server-2005
tsql
Brandon
źródło
źródło
Odpowiedzi:
Zakładając, że
y, m, d
wszystkieint
, a może:Zobacz moją inną odpowiedź dla SQL Server 2012 i nowszych
źródło
yyyymmdd
Format działa niezależnie od tych ustawień. „Sześcio- lub ośmiocyfrowy ciąg jest zawsze interpretowany jako ymd ”. docs.microsoft.com/en-us/sql/t-sql/data-types/... Zobacz tę odpowiedź: stackoverflow.com/a/46064419/2266979Spróbuj tego:
Działa również, ma dodatkową zaletę braku wykonywania konwersji ciągów, więc jest to czyste przetwarzanie arytmetyczne (bardzo szybkie) i nie jest zależne od żadnego formatu daty. Wykorzystuje to fakt, że wewnętrzna reprezentacja SQL Server dla wartości datetime i smalldatetime to dwa wartość części, której pierwsza część jest liczbą całkowitą reprezentującą liczbę dni od 1 stycznia 1900 r., a druga część jest ułamkiem dziesiętnym reprezentującym ułamkową część jednego dnia (dla czasu) --- Więc liczba całkowita 0 (zero ) zawsze przekłada się bezpośrednio na północ o północy 1 stycznia 1900 roku ...
lub, dzięki sugestii @brinary,
Edytowany w październiku 2014 r. Jak zauważył @cade Roux, SQL 2012 ma teraz wbudowaną funkcję:
DATEFROMPARTS(year, month, day)
robi to samo.
Edytowano 3 października 2016 r. (Podziękowania dla @bambams za zauważenie tego i @brinary za naprawienie tego), ostatnie rozwiązanie zaproponowane przez @brinary. nie wydaje się działać przez lata przestępne, chyba że dodawanie lat zostanie wykonane jako pierwsze
źródło
@Year = 2001
,@Month = 13
a@DayOfMonth = 32
wyniki w2002-02-01T00:00:00.000
. Zaakceptowana odpowiedź (autor: Cade Roux) generuje błąd, który jest bardziej przydatny.SQL Server 2012 ma wspaniałą i długo oczekiwaną nową funkcję DATEFROMPARTS (która wywoła błąd, jeśli data jest nieprawidłowa - mój główny sprzeciw wobec rozwiązania tego problemu opartego na DATEADD):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
lub
źródło
Lub używając tylko jednej funkcji dateadd:
źródło
Sql Server 2012 ma funkcję, która utworzy datę na podstawie części ( DATEFROMPARTS ). Dla reszty z nas utworzyłem funkcję db, która określi datę na podstawie części (dzięki @Charles) ...
Możesz to tak nazwać ...
Zwroty...
źródło
Spróbuj CONVERT zamiast CAST.
CONVERT pozwala na trzeci parametr wskazujący format daty.
Lista formatów znajduje się tutaj: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Zaktualizuj po wybraniu innej odpowiedzi jako „poprawnej”:
Naprawdę nie rozumiem, dlaczego wybrano odpowiedź, która wyraźnie zależy od ustawień NLS na twoim serwerze, bez wskazania tego ograniczenia.
źródło
Możesz także użyć
Działa w SQL od wersji 2012 i AzureSQL
źródło
Bezpieczniej i schludniej jest stosować wyraźny punkt początkowy „19000101”
źródło
declare @output datetime2 = 0
i zamiast@Year - 1900
używać@Year - DATEPART(year,0);
? Działa to bez żadnych rzutowań w SQL Server 2008 i znacznie bardziej przejrzyste.Jeśli nie chcesz, aby łańcuchy były poza tym, działa to również (Umieść w funkcji):
źródło
Dodaję rozwiązanie jednowierszowe, jeśli potrzebujesz daty i godziny z części daty i godziny :
źródło
Próbować
źródło
W przypadku wersji SQL Server poniżej 12 mogę zalecić użycie
CAST
w połączeniu zSET DATEFORMAT
jak utworzysz te ciągi, zależy od ciebie
źródło
Spróbuj tego zapytania:
Wynik:
źródło
Wiem, że OP prosi o odpowiedź na SQL 2005, ale pytanie jest dość stare, więc jeśli korzystasz z SQL 2012 lub nowszego, możesz użyć następujących opcji:
Odniesienie: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
źródło
Ja osobiście wolę Substring, ponieważ zapewnia opcje czyszczenia i możliwość podziału łańcucha w razie potrzeby. Zakłada się, że dane mają format „dd, mm, rrrr”.
Oto demonstracja, w jaki sposób można go pozwać, jeśli dane są przechowywane w kolumnie. Nie trzeba dodawać, że idealnie sprawdza się zestaw wyników przed zastosowaniem do kolumny
źródło