날짜 시간 문자열에 1 밀리 초를 추가하는 방법은 무엇입니까?


15

선택을 기반으로 다음과 같이 x 행을 반환 할 수 있습니다.

1   2019-07-23 10:14:04.000
1   2019-07-23 10:14:11.000
2   2019-07-23 10:45:32.000
1   2019-07-23 10:45:33.000

우리는 0의 모든 밀리 초를 가지고 있습니다.

1 x 1 밀리 초를 추가하는 방법이 있습니까? 그래서 선택은 다음과 같습니다.

1   2019-07-23 10:14:04.001
1   2019-07-23 10:14:11.002
2   2019-07-23 10:45:32.003
1   2019-07-23 10:45:33.004

커서를 만들거나 업데이트하지 않고 업데이트하려고합니다.

이것은 내가 원하는 결과를 얻는 쿼리입니다.

  select top 10 ModifiedOn 
    from [SCHEMA].[dbo].[TABLE]
  where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'

81k 값이 있습니다. 필드는 DATETIME입니다.


2
행 1에 1 밀리 초, 행 2에 2 밀리 초, 행 3에 3 밀리 초 등을 추가하려고합니까?
John Eisbrener

답변:


33

Datetime1 밀리 초 수준까지 정확하지 않습니다. 다른 데이터 유형 (예 :)으로 변경하지 않으면 요청한 내용이 불가능합니다 datetime2.

선적 서류 비치

중요한 인용문 :

정확도 .000, .003 또는 .007 초 단위로 올림


13

DateAdd기능은 당신을 위해 무엇을 찾고 있습니다.

millisecond함수에 첫 번째 매개 변수로 사용 하여 밀리 초를 추가하고 있음을 알려줍니다. 그런 다음 사용1 추가 할 밀리 초 수의 두 번째 매개 변수로 하십시오.

다음은 현재 시간을 변수로 가져 와서 1 밀리 초를 추가하고 결과를 두 번째 변수로 저장 한 다음 각 변수를 인쇄하는 예입니다.

Declare @RightNow as DateTime2
Declare @RightNowPlusAMillisecond as DateTime2

Select @RightNow = Getdate()
Select @RightNowPlusAMillisecond = DateAdd(millisecond,1,@RightNow)

Print @RightNow
Print @RightNowPlusAMillisecond

결과 :

2019-07-23 08:25:38.3500000
2019-07-23 08:25:38.3510000

노트 :

Forrest가 다른 답변에서 지적했듯이 datetime데이터 유형은 밀리 초 정밀도를 보장하지 않습니다. .000, .003 또는 .007 초 단위로 반올림합니다. 밀리 초 정밀도를 원하면을 사용하십시오 datetime2.


13

@ Doug-Deden 은 올바른 출발점을 가지고 있지만 질문의 원래 의도라고 생각한 것에 대답하려고했습니다. 행당 밀리 초가 증가하는 결과 세트에 적용하는 방법.

이 경우 ROW_NUMBER공통 테이블 표현식 (조인 등을 포함하여 테이블 구조에 필요한 편집)을 사용할 수 있습니다 .

값을 표시하려면 선택하십시오.

;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
SELECT TOP 1000 *, DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2)) [new_date]
FROM CTE
ORDER BY my_date_column

업데이트는 원래 테이블로 다시 조인됩니다.

;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
UPDATE t SET 
my_date_column = DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2))
FROM CTE c
     JOIN Table1 t ON c.my_id = t.my_id

이 CTE는 업데이트 가능합니다. 에 다시 가입 할 필요가 없습니다 Table1. 그냥 할UPDATE CTE SET my_date_column =...
스티븐 Hibble

4

나는 그것을 사용하여 그것을했다 DATETIME2(3).

아래 쿼리에서 볼 수 있듯이 더 많은 내용이 있습니다 economic.

declare @dt1 datetime2(3)
declare @dt2 datetime2

SELECT @DT1 = SYSDATETIME()
SELECT @DT2=  SYSDATETIME()

SELECT [THE LENGTH OF DATETIME2]=DATALENGTH(@DT2)
      ,[THE LENGTH OF DATETIME2(3)]=DATALENGTH(@DT1)

여기에 이미지 설명을 입력하십시오

의 차이 datetime와는 datetime2잘 설명되어 있습니다 여기에 .

이 연습을 위해 나는 목적을 테스트하기위한 임시 테이블을 생성하고, 999 가지로 채우 random dates에서 01-jan-2019(오늘 23-july-2019)

그런 다음 순서대로 밀리 초를 1에서 999로 설정했습니다.

SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOEXEC OFF

IF OBJECT_ID ('TEMPDB..#T1') IS NOT NULL
   DROP TABLE #T1

CREATE TABLE #t1(the_date DATETIME2(3) NOT NULL PRIMARY KEY CLUSTERED )
GO

-- run this 999 times - hopefully there will be no duplicates
-- SELECT 204*24*60*60 - today is 23-july-2019 - the 203rd day of the year
    DECLARE @DT DATETIME2(3)
    SELECT @DT = CONVERT(DATETIME2(3),
           DATEADD(SECOND, ABS(CHECKSUM(NEWID()) % 17625600), 
                   '2019-01-01'),120) 

    --SELECT @DT

    IF NOT EXISTS( SELECT 1 FROM #T1 WHERE THE_DATE = @DT) 
    INSERT INTO #T1 VALUES (@DT)
GO 999


--check it out what we have
SELECT * FROM #T1

--get the date and the new date
SELECT 
 THE_DATE
,THE_NEW_DATE= DATEADD(MILLISECOND, ROW_NUMBER() OVER (ORDER BY THE_DATE), THE_DATE ) 
 FROM #T1

그리고 이것이 내가 얻는 것입니다 : (부분보기)

여기에 이미지 설명을 입력하십시오


2

다른 포스터 중 하나 가 맞습니다. DATETIME(T-SQL에서) 밀리 초 단위로 정확하지 않습니다 (센티 초 단위로 정확함).

해당 수준의 정확도를 위해을 사용하려고합니다 DATETIME2.

다음은 문자열 datetime을 로 변환 한 datetime2다음 1 밀리 초를 더한 다음 마지막으로 다시 문자열 로 변환하는 예입니다 .

select convert(
            varchar(MAX), --in T-SQL, varchar length is optional
            dateadd(
                millisecond,
                1,
                convert(
                    datetime2,
                    '2019-07-23 12:01:23.11'
                )
            )
        )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.