SQL Server에서 varchar를 datetime으로 변환
어떻게 형식의 문자열을 변환합니까 mmddyyyy
로 datetime
2008 SQL 서버에?
내 대상 열은 DateTime
Convert
대부분의 Date
스타일 값으로 시도했지만 오류 메시지가 나타납니다.
'varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 값이 범위를 벗어났습니다.'
OP는 mmddyy를 원하며 일반 변환은 작동하지 않습니다.
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
그래서 이것을 시도하십시오 :
DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))
산출:
-----------------------
2009-12-31 00:00:00.000
(1 row(s) affected)
SQL Server는 'YYYYMMDD'형식의 문자열을 datetime으로 암시 적으로 캐스팅 할 수 있습니다. 다른 모든 문자열은 명시 적으로 캐스팅해야합니다. 다음은 당신이 말하는 형식에서 변환을 수행하는 두 개의 빠른 코드 블록입니다.
버전 1은 단위 변수를 사용합니다.
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 = @year+@mon+@day
SELECT @output
END
버전 2는 단위 변수를 사용하지 않습니다.
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
두 경우 모두 암시 적 변환을 수행하는 SQL Server의 기능에 의존합니다.
문자열 조작없이 변환에 도움이된다는 것을 알았습니다. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
CONVERT(VARCHAR(23), @lastUploadEndDate, 121)
yyyy-mm-dd hh : mi : ss.mmm (24h)는 필요한 형식이었습니다.
변환은 일반적인 대답이지만 형식이 변환기에 대해 인식되는 형식이 아닙니다. mm / dd / yyyy는 convert (datetime, yourdatestring, 101)을 사용하여 변환 할 수 있지만 해당 형식이 없으므로 실패합니다.
문제는 형식이 비표준이기 때문에 변환자가 사용할 수있는 형식에서 이해할 수있는 표준으로 조작해야합니다.
형식을 보장 할 수 있다면 함께 해킹
declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)
변환 할 수없는 잘못된 데이터가있을 수 있습니다. ASAP 또는 2009 년 2 월 30 일과 같은 날짜를 허용하므로 날짜를 varchar에 저장해서는 안됩니다. 데이터에서 isdate () 함수를 사용하여 변환 할 수없는 레코드를 찾으십시오.
OK I tested with known good data and still got the message. You need to convert to a different format becasue it does not know if 12302009 is mmddyyyy or ddmmyyyy. The format of yyyymmdd is not ambiguous and SQL Server will convert it correctly
I got this to work:
cast( right(@date,4) + left(@date,4) as datetime)
You will still get an error message though if you have any that are in a non-standard format like '112009' or some text value or a true out of range date.
Look at CAST
/ CONVERT
in BOL that should be a start.
If your target column is datetime
you don't need to convert it, SQL will do it for you.
Otherwise
CONVERT(datetime, '20090101')
Should do it.
This is a link that should help as well:
I'd use STUFF
to insert dividing chars and then use CONVERT
with the appropriate style. Something like this:
DECLARE @dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3)
First you use two times STUFF
to get 11/12/90 instead of 111290, than you use the 3 to convert this to datetime
(or any other fitting format: use .
for german, -
for british...) More details on CAST and CONVERT
Best was, to store date and time values properly.
- This should be either "universal unseparated format"
yyyyMMdd
- or (especially within XML) it should be ISO8601:
yyyy-MM-dd
oryyyy-MM-ddThh:mm:ss
More details on ISO8601
Any culture specific format will lead into troubles sooner or later...
I had luck with something similar:
Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
use Try_Convert:Returns a value cast to the specified data type if the cast succeeds; otherwise, returns 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)
I think CONVERT is the best choice as you can include a style (date format), so the USA default would be 110 which is mm-dd-yyyy.
The root cause of this issue can be in the regional settings - DB waiting for YYYY-MM-DD while an app sents, for example, DD-MM-YYYY (Russian locale format) as it was in my case. All I did - change locale format from Russian to English (United States) and voilà.
This seems the easiest way..
SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
SQL standard dates while inserting or updating Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
So if you are inserting/Updating below 1/1/1753 you will get this error.
참고URL : https://stackoverflow.com/questions/1509977/convert-varchar-into-datetime-in-sql-server
'IT박스' 카테고리의 다른 글
React 컴포넌트를 조건부로 래핑하는 방법은 무엇입니까? (0) | 2020.11.28 |
---|---|
java.sql.Timestamp와 함께 Joda-Time을 사용하는 방법 (0) | 2020.11.28 |
IPv4, IPv6 주소를 문자열로 저장하기위한 크기 (0) | 2020.11.28 |
DOM 속성 변경시 이벤트 발생 (0) | 2020.11.28 |
C에서 문자열과 정수를 연결하는 방법은 무엇입니까? (0) | 2020.11.28 |