날짜 시간 열을 초 수로 변환


11

내 SQL Server 데이터베이스에는 datetime열이 있습니다.

열의 long값을 나타내는 새 열을 만드는 좋은 방법은 무엇입니까 datetime? 는 long초 수를 나타냅니다 것입니다.

로 변환 할 수 있다면 longs긴 숫자를 고정 된 양으로 나눌 수 있기 때문에 기간별로 쿼리별로 그룹화하는 것이 더 쉬울 것이라고 생각했습니다.

테이블이 정적이므로 데이터를 업데이트하거나 삭제하지 않습니다.

답변:


13

새 컬럼 (ALTER TABLE)을 작성하고 그에 대해 UPDATE를 실행하십시오.

UPDATE
  MyTable
SET
  NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)

19000101SQL Server 시대입니다. 19700101예를 들어 유닉스 시대에 사용할 수 있습니다.


12

@gbn에서 제안한대로 새 열을 추가하고 수동으로 업데이트 할 수 있지만 삽입 / 업데이트 트리거 또는 다른 메커니즘을 사용하여이 열을 지속적으로 최신 상태로 유지해야합니다. 테이블 / 열 이름에 대한 @gbn의 추측을 차용 한 지속적인 유지 관리가 필요하지 않은 몇 가지 방법이 있습니다.

계산 열

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19000101', MyDateTimeColumn));

--or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19700101', MyDateTimeColumn));

스토리지에 대한 쿼리 성능을 떨어 뜨리고이 열을 유지하고 색인을 생성 할 수 있지만 계산을 약간 변경해야합니다 (위를 유지하려고하면 계산이 결정적이지 않다는 오류가 발생 함).

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 0, MyDateTimeColumn)) PERSISTED;

-- or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 25567, MyDateTimeColumn)) PERSISTED;

쓰기 성능 (또는 스토리지)보다 읽기 성능에 더 관심이있는 경우 열을 유지하려고합니다.

전망

새 열에 대한보기의 이점 중 하나는 기본 테이블 스키마를 변경할 필요가 없다는 것입니다 (또는 최신 상태로 유지할 염려가 없습니다). 비 지속적 계산 열과 동일한 쿼리 시간에 계산 비용을 지불합니다.

CREATE VIEW dbo.vMyTable
AS
  SELECT -- other columns,
    MyDateTimeColumn,
    NewIntColumn = DATEDIFF(...whichever calc above makes sense...)
  FROM dbo.MyTable;

실행 시간

위의 계산은 지나치게 복잡하지 않으므로 쿼리에 계산을 포함하십시오. 데이터 액세스를 위해 저장 프로 시저를 사용하고 있기 때문에 자주 반복하지 않기를 바랍니다.

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