programing

SQL Server 문자열에서 최신 변환

bestprogram 2023. 4. 7. 22:00

SQL Server 문자열에서 최신 변환

다음과 같은 문자열을 변환합니다.

'10/15/2008 10:06:32 PM'

SQL Server의 동등한 DATETIME 값으로 변환합니다.

Oracle에서는 다음과 같이 말할 수 있습니다.

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

이 질문은 문자열을 표준 형식 중 하나로 해석한 후 이러한 코드 중 하나를 사용하여 변환해야 함을 의미합니다.그런 일상적인 수술치고는 터무니없어 보인다.더 쉬운 방법은 없나요?

이거 드셔보세요

Cast('7/7/2011' as datetime)

그리고.

Convert(DATETIME, '7/7/2011', 101)

자세한 내용은 CASTCONVERT(Transact-SQL)참조하십시오.

쿼리 프로세서를 통해 실행합니다.날짜 및/또는 시간 형식을 지정합니다.이 중 하나가 원하는 것을 제공합니다.적응하기가 어렵지 않습니다.

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'

SQL Server Denali에서는 원하는 것에 근접한 작업을 수행할 수 있습니다.그러나 임의로 정의된 이상한 날짜 문자열을 전달하고 SQL Server가 수용할 것으로 기대할 수는 없습니다.여기 당신이 자신의 답변에 올린 것을 사용한 예가 있습니다.FORMAT() 함수는 옵션 인수로서 로케일을 받아들일 수도 있습니다.이 함수는 에 기초하고 있습니다.Net의 포맷이기 때문에 모든 토큰 포맷은 아니더라도 대부분 사용할 수 있습니다.

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

좀 더 통제하고 데이트 정보를 삭제하길 강력히 권합니다.자유 텍스트 양식 필드에 원하는 형식을 사용하여 날짜를 입력할 수 있는 시대는 이미 지났습니다.2011년 8월 9일에 들어가면 8월 9일인가요, 9월 8일인가요?달력 컨트롤에서 날짜를 선택하게 하면 앱이 형식을 제어할 수 있습니다.아무리 사용자의 행동을 예측하려고 해도, 그들은 항상 당신이 계획하지 않은 날짜를 입력할 수 있는 더 멍청한 방법을 찾아낼 것입니다.

하지만 데날리까지는 @Ovidiu가 지금까지 가장 좋은 조언을 해줬다고 생각합니다.독자적인 CLR 기능을 실장하면, 이것은 지극히 사소한 것이 될 수 있습니다.그런 다음 원하는 수의 이상한 비표준 포맷에 대한 케이스/스위치를 쓸 수 있습니다.


@dhergert 업데이트:

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

결과:

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

당신은 여전히 중요한 다른 정보를 먼저 가지고 있어야 합니다.하여 T-SQL을 사용할 수 6/9/20126월 9일 6시 6분입니다.

SQL Server(2005, 2000, 7.0)에는 임의의 구조화된 날짜/시간을 문자열 형식으로 가져와 날짜/시간 데이터 유형으로 변환하는 유연하거나 유연하지 않은 방법이 없습니다.

'독단적으로'란, "당신이나 나, 또는 지구 반대편에 있는 누군가가 아니라도, 그것을 쓴 사람이 직관적이고 완전히 명백하다고 생각할 수 있는 형태"를 의미합니다.솔직히 그런 알고리즘이 있는지 잘 모르겠어요.

사용방법:

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

그리고 변환 코드는 공식 문서의 표를 참조하십시오.

이 문제를 해결하기 위해 사용하는 최선의 솔루션은 SQL Server 2005에서 Date Time 중 하나를 사용하는 CLR 기능을 사용하는 것입니다.지정된 형식의 DateTime 값을 반환하는 Parse 또는 ParseExact 함수.

간단한 답변:

SELECT convert(date, '10/15/2011 00:00:00', 101) as [MM/dd/YYYY]

기타 날짜 형식은 [SQL Server Helper]> [ SQL Server Date Formats ]에서 확인할 수 있습니다.

이걸 알아내는 데 시간이 좀 걸려서 누군가 도움이 될지도 모르니까 여기 있어요.

SQL Server 2012 이상에서는 다음 기능을 사용할 수 있습니다.

SELECT DATEFROMPARTS(2013, 8, 19);

이 함수에 넣을 날짜의 일부를 추출한 방법은 다음과 같습니다.

select
DATEFROMPARTS(right(cms.projectedInstallDate,4),left(cms.ProjectedInstallDate,2),right( left(cms.ProjectedInstallDate,5),2)) as 'dateFromParts'
from MyTable

여기서 가장 많이 투표된 답은 guravg와 Taptronic의 답이다.하지만 한 가지 기여하고 싶은 것이 있습니다.

0 ~ 131 의 구체적인 형식 번호는, 사용 예에 따라서 다를 수 있습니다(여기서 전체 번호 목록 참조). 입력 번호는 비확정적인 것이 될 수 있습니다.즉, SQL SERVER 인스턴스 간에 예측되는 결과 날짜가 일치하지 않으므로 같은 이유로 캐스트 문자열 방식을 사용하지 마십시오.

SQL Server 2005부터 호환성 수준 90으로 암묵적인 날짜 변환은 확정적이지 않게 되었습니다.날짜 변환은 레벨 90부터 SET LOUGE 및 SET DATEFORMAT에 의존하게 되었습니다.

비결정론적 값은 다음과 같습니다.0-100,106,107,109,113,130에러가 발생할 수 있습니다.


설정을 입니다. 하는 것은 결정론적 설정입니다. 현재 제가 선호하는 것은ISOformats)12,112,23,126IT담당자의 사용사례에 있어서 가장 표준인 것 같기 때문입니다.

Convert(varchar(30), '210510', 12)                   -- yymmdd
Convert(varchar(30), '20210510', 112)                -- yyyymmdd
Convert(varchar(30), '2021-05-10', 23)               -- yyyy-mm-dd
Convert(varchar(30), '2021-05-10T17:01:33.777', 126) -- yyyy-mm-ddThh:mi:ss.mmm (no spaces)

페이지에는 CONVERT 함수가 사용할 수 있는 지정된 모든 날짜/시간 변환에 대한 일부 참조가 있습니다.값이 허용 가능한 패턴 중 하나에 속하지 않는 경우 ParseExact 루트를 선택하는 것이 가장 좋다고 생각합니다.

개인적으로는 임의의 형식 또는 전혀 다른 형식의 형식을 취급하고 있는 경우, 미리 알고 있는 경우, regexp를 사용하여 원하는 날짜의 섹션을 가져와 유효한 날짜/시간 구성 요소를 형성합니다.

SQL Server에서 이 문제를 해결하려면 CAST CAST('what' AS datetime)를 사용하십시오.하지만 그것은 전반적으로 나쁜 생각이다.앞으로 다가올 국제 날짜에 대한 문제가 있습니다.이러한 문제를 피하기 위해 ODBC 표준 형식의 날짜를 사용해야 합니다.즉, 형식 번호 120, 20은 두 자리 숫자에 해당하는 형식입니다.SQL Server에는 사용자에게 지정된 형식을 제공할 수 있는 기능이 내장되어 있지 않은 것 같습니다.직접 글을 쓸 수도 있고 온라인으로 검색하면 찾을 수도 있습니다.

MSQL에서 문자열을 datetime으로 암묵적으로 변환

create table tmp 
(
  ENTRYDATETIME datetime
);

insert into tmp (ENTRYDATETIME) values (getdate());
insert into tmp (ENTRYDATETIME) values ('20190101');  --convert string 'yyyymmdd' to datetime


select * from tmp where ENTRYDATETIME > '20190925'  --yyyymmdd 
select * from tmp where ENTRYDATETIME > '20190925 12:11:09.555'--yyyymmdd HH:MIN:SS:MS



이 코드를 사용하면 쉽게 얻을 수 있습니다.

SELECT 변환(datime, Convert(varchar(30), 10/15/2008 10:06:32 PM', 102, 102)

이 글은 문자열 값을 에서 변환하는 함수를 만드는 데 도움이 됩니다.NET Datetime(NET Datetime)ToString(...)을 SQL datetime으로 되돌립니다.시스템에서 1000개의 문자열 날짜로 테스트했습니다.잘 되는 것 같아요.이걸로 시간 절약이 되시길 바랍니다.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Julian King
-- Create date: 3/14/2023
-- Description: Parses and returns a date from a variety of string formats
-- See: https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/
--      Thu Jul 01 2021 00:00:00 GMT-0400 (Eastern Daylight Time)
--      2018-04-16T00:00:00
--      2021-05-04T20:13:34.897781
--      2021-11-04 20:58:57.352836
--      4/17/2020 11:02:59 AM
--      January 13, 2020
-- =============================================
CREATE FUNCTION dbo.DateConvert
(
    @datestring VARCHAR(55)
)
RETURNS DATETIME
AS
BEGIN
    -- Declare the return variable here
    SET @datestring = RTRIM(LTRIM(@datestring))

    IF @datestring IS NULL
        RETURN CAST('1753-1-1' AS DATETIME)  
    
    IF @datestring = ''
        RETURN CAST('1753-1-1' AS DATETIME)

    -- Thu Jul 01 2021 00:00:00 GMT-0400 (Eastern Daylight Time)
    IF LEN(@datestring) > 30 AND @datestring LIKE '%GMT-%'
        SET @datestring = RTRIM(LTRIM(SUBSTRING(@datestring,5,20)))


    -- 2021-05-04T20:13:34.897781
    -- 2020-11-01T00:00:00
    IF @datestring LIKE '%T%'
        SET @datestring = REPLACE(@datestring,'T',' ')

    -- 2021-05-04 20:13:34.897781
    IF LEN(@datestring) = 26
        SET @datestring = SUBSTRING(@datestring,0,20)
    
    IF TRY_CONVERT(DATETIME,@datestring,101) IS NULL 
        RETURN CAST('1753-1-1' AS DATETIME) 
    ELSE
        RETURN CONVERT(DATETIME,@datestring,101) 

    RETURN CAST('1753-1-1' AS DATETIME)  
END
GO

이 코드를 사용하면 문제가 해결됩니다.

convert(date,YOUR_DATE,104)

사용하시는 경우timestamp다음 코드를 사용할 수 있습니다.

convert(datetime,YOUR_DATE,104)
dateadd(day,0,'10/15/2008 10:06:32 PM')

언급URL : https://stackoverflow.com/questions/207190/sql-server-string-to-date-conversion