2009-10-02 17 views
56

Jak przekonwertować ciąg formatu mmddyyyy do datetime w SQL Server 2008?Konwersja varchar do datetime w SQL Server

Moja kolumna docelowa jest w DateTime

Próbowałem z Convert i większość wartości stylu Date jednak pojawia się komunikat o błędzie:

„Konwersja typu danych varchar do datetime typ danych spowodował wartość poza zakresem. "

+1

Czy tsql ma funkcję str_to_date, taką jak MySQL? http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date – dnagirl

+2

OP chce mmddyyyy; select convert (datetime, "12312009") - >>> _ Msg 242, Level 16, State 3, Line 1 Konwersja typu danych char na typ danych datetime spowodowała przekroczenie zakresu datetime. –

Odpowiedz

63

PO chce mmddrr i zwykły konwersja nie zadziała, że:

select convert(datetime,'12312009') 

Msg 242, Level 16, State 3, Line 1 
The conversion of a char data type to a datetime data type resulted in 
an out-of-range datetime value 

więc spróbuj tego:

DECLARE @Date char(8) 
set @Date='12312009' 
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2)) 

wyjściowa:

----------------------- 
2009-12-31 00:00:00.000 

(1 row(s) affected) 
+2

+1, ale czy nie byłoby miło nie musieć splatać strun? http://www.techonthenet.com/oracle/functions/to_date.php – dwerner

+9

@dwerner, jeśli nie chcesz robić takich rzeczy, nie przechowuj ich w niewłaściwym typie danych. – HLGEM

+2

Popraw mnie, jeśli się mylę, ale to był problem proponowany przez pytanie. Moją sugestią jest użycie funkcji dostosowanej do celu. – dwerner

2

Spójrz na CAST/CONVERT w BOL, który powinien być początkiem.

Jeśli Twoja kolumna docelowa to datetime, nie musisz jej konwertować, SQL zrobi to za ciebie.

Inaczej

CONVERT(datetime, '20090101') 

powinno wystarczyć.

To link które powinny pomóc także:

4

Konwersja byłaby normalna odpowiedź, ale format nie jest rozpoznany format przetwornika, dd/mm/rrrr można przekształcić za pomocą konwersji (datetime, yourdatestring, 101), ale nie masz tego formatu, więc nie powiedzie się.

Problem jest format jest niestandardowe, trzeba będzie manipulować go do standardu nawrócony może zrozumieć z tych dostępnych.

Hacked razem, jeśli można Gwarantujemy format

declare @date char(8) 
set @date = '12312009' 
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112) 
0

myślę CONVERT jest najlepszym wyborem, ponieważ można dołączyć stylu (format daty), więc domyślną USA byłoby 110, który jest MM-DD -yyyy.

4

Prawdopodobnie masz złe dane nie można dokonać konwersji. Daty nigdy nie powinny być przechowywane w varchar, ponieważ pozwoli to na daty takie jak ASAP lub 02/30/2009. Użyj funkcji isdate() na swoich danych, aby znaleźć rekordy, które nie mogą się skonwertować.

OK Testowałem ze znanymi dobrymi danymi i nadal otrzymałem wiadomość. Musisz przekonwertować na inny format, ponieważ nie wie, czy 12302009 to mmddyyyy czy ddmmyyyy.Format RRRRMMDD nie jest niejednoznaczne i SQL Server będzie konwertować poprawnie

mam to do pracy:

cast(right(@date,4) + left(@date,4) as datetime) 

Będziesz nadal pojawia się komunikat o błędzie, ale jeśli masz jakieś, które znajdują się w niestandardowym format taki jak "112009" lub pewna wartość tekstowa lub prawdziwa poza zasięgiem.

6

Serwer SQL może niejawnie przesyłać łańcuchy w postaci "RRRRMMDD" do datetime - wszystkie inne ciągi muszą być jawnie rzutowane. Oto dwa krótkie bloki kodu, który będzie wykonać konwersji z postaci, o której mówisz:

wersji 1 wykorzystuje zmienne jednostkowe:

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME 

SET @input = '10022009' --today's date 


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4) 

SELECT @output = @[email protected][email protected] 
SELECT @output 
END 

wersja 2 nie używać zmiennych jednostkowych:

BEGIN 
DECLARE @input CHAR(8), @output DATETIME 
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2) 

SELECT @output 
END 

Oba przypadki polegają na możliwości serwera sql do wykonania tej niejawnej konwersji.

1

miałem szczęścia z czymś podobnym:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day) 
+ '/' + CONVERT(VARCHAR(4), @Year)) 
0

Przyczyną tego problemu może być w ustawieniach regionalnych - DB czekając YYYY-MM-DD podczas an on- ków aplikacji, na przykład, DD-MM -YYYY (rosyjski format lokalny), tak jak było w moim przypadku. Wszystko co zrobiłem - zmień format lokalny z rosyjskiego na angielski (Stany Zjednoczone) i voila.

0

Wydaje najprostszy sposób ..

SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','') 
0

daty standardowe SQL podczas wstawiania lub aktualizowania muszą być między 01/01/1753 a 12/31/9999 00:00:00 11:59:59 PO POŁUDNIU.

Jeśli więc wstawiasz/aktualizujesz poniżej 1/1/1753, otrzymasz ten błąd.

1

Chciałbym użyć STUFF do wstawienia znaków podziału, a następnie użyć CONVERT z odpowiednim stylem. Coś takiego:

DECLARE @dt VARCHAR(100)='111290'; 
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3) 

Najpierw trzeba użyć dwóch razy STUFF dostać 11/12/90 zamiast 111290, niż użyć przekonwertować to do datetime (lub innym formacie Oprawa: użyj . dla niemiecki, - dla brytyjskiego ...) More details on CAST and CONVERT

Najlepsze było, aby odpowiednio zapisać datę i godzinę.

  • ta powinna być "uniwersalny nierozdzielone Format" yyyyMMdd
  • lub (zwłaszcza w ciągu XML) powinien być ISO8601: yyyy-MM-dd lub yyyy-MM-ddThh:mm:ssMore details on ISO8601

Każda kultura Format specyficzny doprowadzi do kłopotów prędzej czy później ...

0

use Try_Convert: zwraca wartość rzutowania na określony typ danych, jeśli rzutowanie się powiedzie; w przeciwnym razie zwraca wartość null.

DECLARE @DateString VARCHAR(10) ='20160805' 
SELECT TRY_CONVERT(DATETIME,@DateString) 

SET @DateString ='Invalid Date' 
SELECT TRY_CONVERT(DATETIME,@DateString) 

Link: MSDN TRY_CONVERT (Transact-SQL)

Powiązane problemy