Chcę przekonwertować ciąg taki jak ten:
'10/15/2008 10:06:32 PM'
na równoważną wartość DATETIME w Sql Server.
W Oracle powiedziałbym tak:
TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')
To pytanie sugeruje, że muszę przeanalizować ciąg znaków do jednego ze standardowych formatów , a następnie przekonwertować przy użyciu jednego z tych kodów. To wydaje się niedorzeczne w przypadku tak przyziemnej operacji. Czy istnieje prostszy sposób?
sql-server
tsql
datetime
sql-server-2005
string-to-datetime
JosephStyons
źródło
źródło
Odpowiedzi:
SQL Server (2005, 2000, 7.0) nie ma żadnego elastycznego, a nawet nieelastycznego sposobu na przyjęcie arbitralnie uporządkowanej daty i godziny w formacie łańcuchowym i przekonwertowanie jej na typ danych.
Przez „arbitralnie” rozumiem „formę, którą osoba, która to napisała, choć być może nie ty, ja ani ktoś z drugiej strony planety, uważałby ją za intuicyjną i całkowicie oczywistą”. Szczerze mówiąc, nie jestem pewien, czy istnieje taki algorytm.
źródło
9/6/12
oznaczał 6 września 2012 r., 9 czerwca 2012 r., 6 grudnia 2009 r., czy coś innego?Spróbuj tego
i
Aby uzyskać więcej informacji, zobacz CAST i CONVERT (Transact-SQL) .
źródło
Cast('2011-07-07' as datetime)
również działa i eliminuje dwuznaczność w stosunku do zamówień z miesiąca na dzień.SET DATEFORMAT dmy
przed zapytaniemUruchom to przez procesor zapytań. Formatuje daty i / lub godziny, a jeden z nich powinien dać ci to, czego szukasz. Dostosowanie nie będzie trudne:
źródło
W SQL Server Denali będziesz mógł zrobić coś, co zbliży się do tego, czego szukasz. Ale nadal nie można po prostu przekazać dowolnego arbitralnie zdefiniowanego ciągu niepoprawnej daty i oczekiwać, że SQL Server go dostosuje. Oto jeden przykład z wykorzystaniem czegoś, co opublikowałeś we własnej odpowiedzi. Funkcja FORMAT () i może również akceptować ustawienia narodowe jako opcjonalny argument - opiera się na formacie .Net, więc większość, jeśli nie wszystkie formaty tokenów, które można zobaczyć, będą dostępne.
Gorąco zachęcam do przejęcia większej kontroli i oczyszczenia danych wejściowych. Dni, w których ludzie mogą wpisywać daty w dowolnym formacie w dowolnym polu formularza, powinny być już za nami. Jeśli ktoś wejdzie 8/9/2011, czy to jest 9 sierpnia czy 8 września? Jeśli sprawisz, że wybiorą datę na kontrolce kalendarza, aplikacja będzie mogła kontrolować format. Bez względu na to, ile próbujesz przewidzieć zachowanie użytkowników, zawsze wymyślą głupszy sposób na wpisanie daty, której nie planowałeś.
Jednak do Denali uważam, że @Ovidiu ma jak dotąd najlepszą radę ... można to uczynić dość trywialnym poprzez wdrożenie własnej funkcji CLR. Następnie możesz napisać skrzynkę / przełącznik dla dowolnej liczby zwariowanych niestandardowych formatów.
AKTUALIZACJA dla @herhert :
Wyniki:
Nadal musisz mieć tę inną kluczową informację w pierwszej kolejności. Nie można użyć natywnego języka T-SQL do ustalenia, czy
6/9/2012
jest to 9 czerwca, czy 6 września.źródło
W przypadku tego problemu najlepszym rozwiązaniem, którego używam, jest posiadanie funkcji CLR w Sql Server 2005, która korzysta z jednej z funkcji DateTime.Parse lub ParseExact, aby zwrócić wartość DateTime w określonym formacie.
źródło
Użyj tego:
I zapoznaj się z tabelą w oficjalnej dokumentacji kodów konwersji.
źródło
dlaczego nie spróbować
formaty dat można znaleźć w SQL Server Helper> SQL Server Date Formats
źródło
select convert(date,'10/15/2011 00:00:00',101)
. Więcej informacji o formacie i dlaczego 101, na docs.microsoft.com/en-us/sql/t-sql/functions/…Zajęło mi to chwilę, aby to rozgryźć, więc na wypadek, gdyby to mogło komuś pomóc:
W SQL Server 2012 i lepszych możesz użyć tej funkcji:
Oto, jak skończyłem wyodrębnianie części daty, aby wprowadzić tę funkcję:
źródło
Na tej stronie znajdują się odniesienia do wszystkich określonych konwersji daty i godziny dostępnych dla funkcji CONVERT. Jeśli twoje wartości nie mieszczą się w jednym z akceptowalnych wzorców, myślę, że najlepszą rzeczą jest pójście drogą ParseExact.
źródło
Osobiście, jeśli masz do czynienia z dowolnymi lub całkowicie nieużytecznymi formatami, pod warunkiem, że wiesz, co jest z wyprzedzeniem lub będzie, po prostu użyj wyrażenia regularnego, aby wyciągnąć sekcje z żądanej daty i utworzyć prawidłowy składnik data / data / godzina.
źródło
Wiem, że to zły, stary post z mnóstwem odpowiedzi, ale wiele osób myśli, że POTRZEBUJĄ albo rozłożyć rzeczy na części i złożyć je z powrotem, albo twierdzą, że nie ma sposobu, aby pośrednio wykonać konwersję, o którą poprosił oryginał OP .
Aby przejrzeć i, miejmy nadzieję, udzielić łatwej odpowiedzi innym osobom z tym samym pytaniem, PO zapytał, jak przekonwertować „10/15/2008 10:06:32 PM” na DATETIME. Teraz SQL Server ma pewne zależności językowe do konwersji czasowych, ale jeśli językiem jest angielski lub coś podobnego, staje się to prostym problemem ... po prostu wykonaj konwersję i nie martw się o format. Na przykład (i możesz użyć CONVERT lub CAST) ...
... i to daje następujące odpowiedzi, które są poprawne.
Jak mówią w reklamach telewizyjnych: „Ale czekaj! Nie zamawiaj jeszcze! Bez dodatkowych kosztów może zrobić DUŻO więcej!”
Zobaczmy prawdziwą moc czasowych konwersji z DATETIME i częściowo zbadajmy błąd znany jako DATETIME2. Sprawdź niesamowite formaty, które DATETIME może obsługiwać automatycznie, a których DATETIME2 nie. Uruchom następujący kod i zobacz ...
Tak, tak ... SQL Server faktycznie ma dość elastyczną metodę obsługi wszelkiego rodzaju dziwnych formatów czasowych i nie jest wymagana żadna specjalna obsługa. Nie musieliśmy nawet usuwać „PM” dodanych do 24-godzinnych czasów. To „PFM” (Pure Freakin 'Magic).
Rzeczy będą się nieco różnić w zależności od JĘZYKA, który wybrałeś dla swojego serwera, ale cała jego część będzie obsługiwana w obu kierunkach.
A te „auto-magiczne” konwersje nie są niczym nowym. Cofają się naprawdę daleko.
źródło
Jeśli chcesz, aby SQL Server próbował to rozgryźć, po prostu użyj CAST CAST („jakikolwiek” AS datetime). To jednak ogólnie zły pomysł. Pojawią się problemy z międzynarodowymi datami. Jak już odkryłeś, aby uniknąć tych problemów, chcesz użyć kanonicznego formatu daty ODBC. To jest format numer 120, 20 jest formatem tylko dwucyfrowym. Nie sądzę, że SQL Server ma wbudowaną funkcję, która pozwala na podanie formatu określonego przez użytkownika. Możesz napisać własny, a może nawet go znaleźć, jeśli będziesz szukać w Internecie.
źródło
pośrednio przekonwertować ciąg na datetime w MSSQL
źródło
źródło