SQL Server의 타임 스탬프 열을 datetime 형식으로 변환하는 방법


90

SQL Server가 다음과 같은 타임 스탬프를 반환하므로 'Nov 14 2011 03:12:12:947PM' 하므로 문자열을 'Ymd H : i : s'와 같은 날짜 형식으로 쉽게 변환하는 방법이 있습니까?

지금까지 사용

date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))

답변:


253

SQL Server의 TIMESTAMP데이터 유형은 날짜 및 시간과 관련없습니다 !

연속 된 8 바이트 정수의 16 진수 표현 일뿐입니다. 행을 읽은 이후로 변경되지 않았는지 확인하는 데만 유용합니다.

16 진수 정수를 읽거나 BIGINT. 예로서:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

결과는

400756068

최신 버전의 SQL Server에서는 이것이 RowVersion진짜이기 때문에 호출되고 있습니다. ROWVERSION에 대한 MSDN 문서를 참조하십시오 .

데이터베이스 내에서 자동으로 생성 된 고유 한 이진 숫자를 노출하는 데이터 형식입니다. rowversion은 일반적으로 테이블 행의 버전 스탬프 지정 메커니즘으로 사용됩니다. rowversion 데이터 유형은 증가하는 숫자 일 뿐이며 날짜 나 시간을 유지하지 않습니다 . 날짜 또는 시간을 기록하려면 datetime2 데이터 유형을 사용하십시오.

따라서 SQL Server 를 날짜 / 시간으로 변환 할 수 없습니다TIMESTAMP . 날짜 / 시간이 아닙니다.

그러나 타임 스탬프를 말하고 있지만 실제로는 DATETIME열 을 의미하는 경우 MSDN 도움말 의 CAST 및 CONVERT 항목에 설명 된 유효한 날짜 형식을 사용할 수 있습니다 . 이들은 SQL Server에서 "즉시"정의되고 지원됩니다. 다른 것은 지원되지 않습니다. 예를 들어 많은 수동 캐스팅 및 연결을 수행해야합니다 (권장하지 않음).

찾고있는 형식은 ODBC 표준 (스타일 = 121) 과 비슷합니다 .

DECLARE @today DATETIME = SYSDATETIME()

SELECT CONVERT(VARCHAR(50), @today, 121)

제공합니다 :

2011-11-14 10:29:00.470

SQL Server 2012는 마침내FORMAT 사용자 지정 서식을 수행 하는 기능갖게됩니다.


6
아마도 SQL Server에 대한 가장 큰 관심사 일 것입니다. 시간을 알 수 없는데 왜 타임 스탬프라고 부르나요?
BelgoCanadian

1
@BelgoCanadian : Sybase에 물어보세요-Sybase / SQL Server에 영원히 남아있는 기능입니다 .....
marc_s

1
@BelgoCanadian 지금은 rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/…
Jason S

거기 TIMESTAMP유형 컬럼
Ghilteras는

3

동료들이이 작업을 도와주었습니다.

select CONVERT(VARCHAR(10), <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(VARCHAR(10), <tms_column>, 112);

또는

select CONVERT(DATE, <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(DATE, <tms_column>, 112);

3

이를 수행하는 가장 간단한 방법은 다음과 같습니다.

SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;

이것은 적어도 읽을 수있는 형식으로 날짜 열을 제공합니다. 또한 형식을 변경하려면 여기를 클릭 하십시오 .


11
문제는 SQLServer를하지 MySQL은입니다
마이크 M

3

캐스트를 사용하면 타임 스탬프 필드에서 날짜를 가져올 수 있습니다.

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

18
이것은 작동하지 않는 것 같습니다 :Explicit conversion from data type timestamp to date is not allowed.
jocull

나쁜 생각. 타임 스탬프 필드는 시퀀스 일뿐입니다. 운이 좋아서 데이트를 할 수도 있지만, 데이트는 의미가 없습니다. 16 진수가 아닌 10 진수를 원하면 BIGINT로 캐스트해야합니다. 타임 스탬프는 이제 rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/…
Jason S

3

이 메시지를 제외하고 잘 작동합니다.

데이터 형식 varchar에서 타임 스탬프로 암시 적으로 변환 할 수 없습니다. 이 쿼리를 실행하려면 CONVERT 함수를 사용하십시오.

예, TIMESTAMP( RowVersion)는 DATE 가 아닙니다 . :)

솔직히 말해서 나는 그것을 날짜로 변환하는 방법을 찾기 위해 꽤 시간을 허비했습니다.

가장 좋은 방법은 변환 INT하고 비교하는 것입니다. 이것이 바로이 유형의 의미입니다.

당신이 데이트를 원한다면-그냥 Datetime칼럼을 추가하고 행복하게 살기 :)

건배 맥


1
또는 8 바이트이므로 BIGINT
Jason S

2

"당신은 그 단어를 계속 사용합니다. 나는 그것이 당신이 의미한다고 생각하는 것을 의미하지 않습니다." — 이니 고 몬토야

타임 스탬프는 marc_s가 원래 말했듯이 시간과 전혀 관련이 없습니다.

declare @Test table (
     TestId int identity(1,1) primary key clustered
    ,Ts     timestamp
    ,CurrentDt datetime default getdate()
    ,Something varchar(max)
)

insert into @Test (Something)
    select name from sys.tables
waitfor delay '00:00:10'

insert into @Test (Something)
    select name from sys.tables

select * from @Test

출력에서 Ts (16 진수)는 각 레코드에 대해 1 씩 증가하지만 실제 시간에는 10 초의 간격이 있습니다. 시간과 관련된 경우 시간의 차이와 일치하는 타임 스탬프에 간격이있을 것입니다.


0

Timestamp로 정수 CONVERT (BIGINT, [timestamp])로 변환을 구현 한 후 다음과 같은 결과를 얻었습니다.

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126

예, 이것은 날짜와 시간이 아닙니다. 일련 번호입니다.


0

나를 위해 일합니다 : TO_DATE ( '19700101', 'yyyymmdd') + (TIME / 24/60/60) (oracle DB)


0

타임 스탬프와 같은 문제가 있습니다. 예 : '29 -JUL-20 04.46.42.000000000 PM '. 'yyyy-MM-dd'형식으로 바꾸고 싶었습니다. 마침내 나를 위해 작동하는 솔루션은

SELECT TO_CHAR (mytimestamp, 'YYYY-MM-DD') FROM mytable;


0

나는 당신이 삽입 문으로 데이터 덤프를했다고 가정하고, 당신 (또는 구글에있는 사람)이 날짜와 시간을 알아 내거나 다른 곳에서 사용하기 위해 번역하려고 시도하고 있다고 가정 할 것이다 (예 : MySQL 삽입으로 변환). 이것은 실제로 모든 프로그래밍 언어에서 쉽습니다.

이것으로 작업합시다 :

CAST(0x0000A61300B1F1EB AS DateTime)

이 16 진수 표현은 실제로 두 개의 개별 데이터 요소 인 날짜와 시간입니다. 처음 4 바이트는 날짜이고 두 번째 4 바이트는 시간입니다.

  • 날짜는 0x0000A613입니다.
  • 시간은 0x00B1F1EB입니다.

선택한 프로그래밍 언어를 사용하여 두 세그먼트를 정수로 변환합니다 (모든 최신 프로그래밍 언어에서 지원되는 16 진수에서 정수로의 직접적인 변환이므로 프로그래밍 언어 일 수도 있고 아닐 수도있는 코드로 공간을 낭비하지 않을 것입니다.) 당신은에서 일하고 있습니다).

  • 0x0000A613의 날짜는 42515가됩니다.
  • 0x00B1F1EB의 시간은 11661803이됩니다.

이제 그 정수로 무엇을할까요?

데이트

날짜는 1900 년 1 월 1 일 이후이며 날짜로 표시됩니다. 따라서 1900 년 1 월 1 일에 42,515 일을 더하면 결과는 2016 년 5 월 27 일입니다.

시각

시간은 조금 더 복잡합니다. 해당 INT를 취하고 다음을 수행하여 자정 이후 (의사 코드) 이후 시간을 마이크로 초 단위로 가져옵니다.

TimeINT=Hex2Int(HexTime)
MicrosecondsTime = TimeINT*10000/3

거기에서 언어가 선호하는 함수 호출을 사용하여 마이크로 초 (위의 예에서는 38872676666.7 µs)를 시간으로 변환하십시오.

결과는 10 : 47 : 52.677입니다.


-1

그들 중 일부는 실제로 SQL Server 2008 이후 의 날짜 시간으로 은밀히 처리됩니다.

다음 SQL 쿼리를 시도하면 직접 확인할 수 있습니다.

SELECT CAST (0x00009CEF00A25634 AS datetime)

위의 결과 2009-12-30 09:51:03:000가 발생하지만 실제로 날짜-시간에 매핑되지 않는 항목을 만났습니다.


1
그러지 마. 운이 좋으면 전환을 얻을 수 있지만 날짜 시간은 의미가없고 오해의 소지가 있습니다. 타임 스탬프는 시퀀스 번호 일 뿐이며 이제 행 버전 docs.microsoft.com/en-us/sql/t-sql/data-types/… 라고합니다 . 십진수를 원하는 경우 BIGINT로 캐스트
Jason S


-3

여기에 뭔가 빠졌는지 확실하지 않지만 다음과 같이 타임 스탬프를 변환 할 수는 없습니다.

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)

이거 해봤 어? TIMESTAMP는 DATE와 관련이 없습니다.
Sean Pearce

SQL Server 2008에서 사용하고 있습니다
Daniel

다시 말하지만, datetime으로 캐스트하지 마십시오. 단순히 16 진 형식의 정수 시퀀스입니다. BIGINT로 캐스트하십시오.
Jason S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.