Próbowałem utworzyć tabelę w następujący sposób:
create table table1(date1 datetime,date2 datetime);
Najpierw próbowałem wstawić wartości jak poniżej,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Popełnił błąd mówiąc:
Nie można przekonwertować varchar na datetime
Następnie wypróbowałem poniższy format jako jeden z postów sugerowanych przez nasz stackoverflow,
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
Ale nadal pojawia się błąd, który mówi:
Konwersja nie powiodła się podczas konwersji daty i / lub godziny z ciągu znaków
Jakieś sugestie?
sql
sql-server
Mari
źródło
źródło
Odpowiedzi:
Istnieje wiele formatów obsługiwanych przez SQL Server - zobacz MSDN Books Online na temat CAST i CONVERT . Większość z tych formatów zależy od posiadanych ustawień - dlatego te ustawienia mogą czasami działać - a czasami nie.
Sposobem rozwiązania tego problemu jest użycie (nieznacznie dostosowanego) formatu daty ISO-8601, który jest obsługiwany przez SQL Server - ten format działa zawsze - niezależnie od języka SQL Server i ustawień formatu daty .
Format ISO-8601 jest obsługiwany przez SQL Server w dwóch wersjach:
YYYYMMDD
tylko daty (bez części czasu); uwaga: bez myślników! , to bardzo ważne! NIEYYYY-MM-DD
jest niezależne od ustawień formatu daty w serwerze SQL i NIE będzie działać we wszystkich sytuacjach!lub:
YYYY-MM-DDTHH:MM:SS
w przypadku dat i godzin - uwaga: ten format zawiera myślniki (ale można je pominąć) i ustalonyT
separator między datą a godziną w plikuDATETIME
.Dotyczy to SQL Server 2000 i nowszych.
Więc w swoim konkretnym przypadku - użyj tych ciągów:
i powinno być dobrze (uwaga: w tym celu należy użyć międzynarodowego formatu 24-godzinnego zamiast 12-godzinnego formatu AM / PM).
Alternatywnie : jeśli korzystasz z SQL Server 2008 lub nowszego, możesz również użyć
DATETIME2
typu danych (zamiast zwykłegoDATETIME
), a Twój obecnyINSERT
będzie działał bez żadnych problemów! :-)DATETIME2
jest o wiele lepszy i mniej wybredny pod względem konwersji - i tak jest to zalecane typy danych data / czas dla SQL Server 2008 lub nowszego.Nie pytajcie mnie, dlaczego cały ten temat jest taki podstępny i nieco zagmatwany - po prostu tak jest. Ale z
YYYYMMDD
formatem powinno być w porządku dla każdej wersji SQL Server i dla dowolnego ustawienia języka i formatu daty w SQL Server.źródło
Konwersja na serwerze SQL czasami kończy się niepowodzeniem nie z powodu użytych formatów daty lub czasu. Dzieje się tak tylko dlatego, że próbujesz zapisać nieprawidłowe dane, które nie są akceptowane przez system.
Przykład:
Create Table MyTable (MyDate);
Insert Into MyTable(MyDate) Values ('2015-02-29');
Serwer SQL zgłosi następujący błąd:
Conversion failed when converting date and/or time from character string.
Powodem tego błędu jest po prostu brak takiej daty (29 lutego) w roku (2015).
źródło
Prosta odpowiedź - 5 to włoskie „yy”, a 105 to włoskie „yyyy”. W związku z tym:
będzie działać poprawnie, ale
da błąd.
Również,
da błąd, gdzie jak
będzie działać.
źródło
Po prostu zaktualizuj format daty, jak poniżej
Rozwiązuje problem za mnie i działa dobrze
źródło
DATEFORMAT
ustawienia sesji . Sprawdź to, uruchamiającSET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);
. Będzie działać niezawodnie, jeśli dodaszT
separator (yyyy-MM-ddTHH:mm:ss
).O ile to możliwe, należy unikać literałów daty / czasu specyficznych dla kultury .
Istnieje kilka bezpiecznych formatów, które pozwalają podać datę / godzinę jako dosłowne:
Wszystkie przykłady dla
2016-09-15 17:30:00
ODBC (mój ulubiony, ponieważ jest traktowany jako prawdziwy typ natychmiast)
{ts'2016-09-15 17:30:00'}
--Znak czasu{d'2016-09-15'}
- Tylko data{t'17:30:00'}
- Tylko czasISO8601 (najlepsze wszędzie )
'2016-09-15T17:30:00'
- uważajT
na środek!Unseperated (niewielkie ryzyko błędnej interpretacji jako liczby)
'20160915'
- tylko dla czystej randkiWarto pamiętać: nieprawidłowe daty zwykle pojawiają się z dziwnymi błędami
Jeszcze jeden powód dziwnych błędów konwersji: kolejność wykonywania!
SQL-Server dobrze wie, że robi rzeczy w kolejności wykonywania, której można by się nie spodziewać. Twoje pisemne oświadczenie wygląda tak, jakby konwersja została wykonana przed jakimś działaniem związanym z typem, ale silnik decyduje - dlaczego kiedykolwiek - o wykonaniu konwersji w późniejszym etapie.
Oto świetny artykuł wyjaśniający to z przykładami: Rusano.com: „t-sql-functions-do-no-imply-a-pewna-kolejność-wykonania” i tutaj jest powiązane pytanie .
źródło
najlepszym sposobem jest ten kod
źródło
źródło
Format daty i godziny faktycznie działający na serwerze sql to
źródło
m
iM
). Przeczytaj komentarz Dana Guzmana do odpowiedzi Pronab Roy. I przeczytaj inne odpowiedzi tutaj ...Proszę, spróbuj tego.
SQL Server oczekuje dat w formacie MM / DD / RRRR, jeśli angielski jest ustawiony jako język domyślny.Tutaj zapisuję wartość datepicker do bazy danych sql2008.Moje typ pola to datetime w database.dpdob to moja nazwa datapicker.
Teraz użyj dob w zapytaniu wstawiającym.
źródło
Możesz wypróbować ten kod
źródło
Wystąpił ten problem, gdy próbowałem połączyć
getdate()
w ciąg, który wstawiałem do pola nvarchar.Zrobiłem trochę castingu, aby to obejść:
To odkażony przykład. Kluczowa część to:
...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...
Przesłano datę jako
datetime2
, a następnie jakonvarchar
konkatenację.źródło
Wypróbowałem to i działa ze mną:
źródło
ustaw Culture na angielski z pliku web.config
na przykład, jeśli ustawisz kulturę na arabską, tym razem będzie
22/09/2017 02:16:57 ص
i pojawia się błąd: Konwersja nie powiodła się podczas konwersji daty i / lub czasu z ciągu znaków podczas wstawiania daty i godziny
źródło
Oto jak łatwo przekonwertować ciąg ISO na serwer SQL
datetime
:Źródło https://www.sqlservercurry.com/2010/04/convert-character-string-iso-date-to.html
źródło
U mnie to zadziałało:
źródło