2017-09-13 2 views
1

R2는 다음과 같은 형식으로 날짜의 집합을 선택하는 서버 2008 SQL 내가 필요로하는 XML 메시지를 들면 : 나는 구글을 검색SQL Server 날짜 ss.mmmZ

yyyy-mm-ddThh:mi:ss.mmmZ 

및 스택 오버플로는 비트와는 다음과 같은 솔루션에 온 : 날짜의 밀리 세컨드가 "000"어디에이 경우를 제외하고 잘 작동

SELECT STUFF(CONVERT(VARCHAR(50), CAST(GETDATE() AS DATETIMEOFFSET), 127),24,4,'') 

. 그런 경우에는 NULL을 선택합니다.

milliseconds가 "000"인 날짜에도 사용할 수있는 솔루션을 찾으려면 도움을받을 수 있습니까?

당신은 놀러 다음 코드 조각을 사용할 수 있습니다

declare @timestamps table (
i int, 
timestamp datetime 
) 

insert into @timestamps (i, timestamp) 
values 
(1, '2017-09-13 01:00:00.003'), 
(2, '2017-09-13 02:00:00.333'), 
(3, '2017-09-13 03:00:00.000'), 
(4, '2017-09-13 04:00:00') 

select i, timestamp, STUFF(CONVERT(VARCHAR(50), CAST(timestamp AS DATETIMEOFFSET), 127),24,4,'') from @timestamps 
+0

입니다 이건 충분하지 않아요 :'select i, timestamp, CONVERT (varchar (50), timestamp, 127) FROM @ timestamps' – Tanner

+0

먼저 이것을 시도했지만 MS SQL 문서에 쓰여진 것에 대해 - "Z"를 표시하지 않았습니다. 끝 (시간대 오프셋). 따라서 예제의 결과는'2017-09-13T01 : 00 : 00.003Z'이 아니라'2017-09-13T01 : 00 : 00.003'입니다. – Malawirel

답변

1

내 생각에 stuff()을 사용하여 세 번째 소수점 이하의 밀리 초를 없앱니다.

select 
    i 
    , dto3 = convert(varchar(32),convert(datetimeoffset(3),timestamp),127) 
    , plusZ = convert(varchar(32),timestamp,127)+'Z' --without converting to datetimeoffset 
    -- /* SQL Server 2012+ */, tsFormat = format(timestamp,'yyyy-MM-ddTHH:mm:ss.fffZ') 
from @timestamps 

rextester 데모 : http://rextester.com/VKXBET35937

반환 :

+---+--------------------------+--------------------------+ 
| i |   dto3   |   plusZ   | 
+---+--------------------------+--------------------------+ 
| 1 | 2017-09-13T01:00:00.003Z | 2017-09-13T01:00:00.003Z | 
| 2 | 2017-09-13T02:00:00.333Z | 2017-09-13T02:00:00.333Z | 
| 3 | 2017-09-13T03:00:00Z  | 2017-09-13T03:00:00Z  | 
| 4 | 2017-09-13T04:00:00Z  | 2017-09-13T04:00:00Z  | 
| 5 | 2017-09-13T14:12:34.567Z | 2017-09-13T14:12:34.567Z | 
+---+--------------------------+--------------------------+ 

대신 당신은 그냥 (7)에 기본시키는 대신 datetimeoffset(3) 등의 정밀도를 지정할 수 있습니다 당신은 항상 밀리 초 동안 0이 원한다면 당신이 format()를 사용할 수 있지만 위에서뿐만 아니라 작동 2012+ SQL 서버에서210 : 속도가 느려질 수 있습니다

format(timestamp,'yyyy-MM-ddTHH:mm:ss.fffZ') 

그러나 format(), 여기 좀 봐 : format() is nice and all, but… - Aaron Bertrand

+0

대단히 감사합니다! 첫 번째 제안은 내가 찾고있는 것입니다! 예, STUFF()를 사용하여 세 번째 소수점 이하의 밀리 초를 자릅니다. 나는'datetimeoffset' 함수의 "소수 초 정확도"인수에 대해 몰랐습니다. – Malawirel

+0

@Malawirel 도와 드리겠습니다!-'datetimeoffset'과'convert (varchar (32), timestamp, 127) + 'Z''를 함께 사용하는 방법에 차이점이 있습니까? – SqlZim

2

당신 수도 서식 동일한 코드를 사용하지만위한 case 문을 만들 수 필요하면 밀리 것과 = 0

+1

잘 작동하는 것 같습니다. 어쩌면 거기에이 문제에 대한 더 우아한 해결책이 있을까요? 이것을 "올바른"대답으로 표시하기 전에 몇 가지 답장을 기다리게 될 것입니다. 여기에 사용 된 코드이다 : '선택 \t 경우 \t \t 때 DATEPART (밀리 초 타임 스탬프) = 0 \t \t 후 (VARCHAR DATETIMEOFFSET AS (50), CAST (타임 스탬프), 127) 변환 다른 \t \t STUFF (CONVERT (VARCHAR (50), CAST (타임 스탬프 AS DATETIMEOFFSET), 127), 24,4, '') \t 끝 @ 타임 스탬프에서 – Malawirel