2012-04-27 3 views
0

우리 데이터베이스에는 날짜가 정말 어리 석습니다. 월, 일, 년, 분 & 시간은 별도의 열에 저장됩니다. 분명히 이것은 특히 Entity Framework를 사용하여 날짜 범위를 쿼리하는 데 이상적이지 않습니다.MVC를 사용하여 SQL Server 데이터베이스의 값을 업데이트하십시오.

combinedDate이라는 새로운 열을 작성하기로 결정했습니다. 이것은 관련된 날짜 정보가 SQL smalldatetime입니다. 우리 db를 업데이트하려고 시도하는 동안 우리의 응용 프로그램은 멈추고 업데이트를 완료하지 못합니다. 우리의 테스트 db는 8400 개의 행 밖에 없으므로 큰 문제는 아닙니다.

저장 프로 시저를 사용해야합니까? 이것을 달성하기위한 최선의 방법은 무엇입니까?

데이터베이스의 모든 새 항목에 대해 날짜 데이터에이 작업을 수행해야합니다. 이러한 항목은 한 번에 8400 개의 행이 발생할 수 있습니다.

열 형식 :

  • Year int = 12
  • Month int = 4
  • Day int = 27
  • Hour int = 12
  • Min int = 0

새로운 열 : smalldatetime

  • combinedDate = '2012-04-27 12:00:00 PM'
+0

SQL = SQL Server ?? SQL은 실제로 ** 구조화 된 쿼리 언어 ** 일뿐입니다 - 데이터베이스 제품이 아닙니다 ... –

답변

1

내가 계산 열이 가장 좋은 방법이라고 동의 부품 y, m,에서 DATETIME d (가정 정수)를 얻는다.

아마 다른 각도를 고려해야합니다. 대신 날짜를 계산, 오히려

Year as (DATEPART('yyyy', Time)) persisted not null, 
Month as (DATEPART('m', Time)) persisted not null, 
Day as (DATEPART('d', Time)) persisted not null, 
Hour as (DATEPART('hh', Time)) persisted not null, 
Min as (DATEPART('mi', Time)) persisted not null, 
Time datetime not null 

Link to DATEPART documentation

을 통해 자동으로 시간 열을 업데이트 할 때 확인 다른 필드를해야합니다 그 방법을 년/월/일 /시/분을 계산한다.

면책 조항 :이 글을 쓰는 시점에서 DATEPART가 지속성을 사용하는 것이 결정적인지 확신 할 수 없습니다.

+0

당신의'DATEPART'는 완전히 정확하지 않습니다 :'Year as (DATEPART (YEAR, Time)) not null persisted' - 첫 번째 매개 변수는 따옴표없이 부품의 정의 일뿐입니다 –

1

a computed column를 사용할 수 있습니까? 이렇게하면 년, 월, 일, 시간, 분 및 날짜/시간 필드가 동기화되어 있는지 확인할 수 있습니다 (첫 번째 필드를 유지해야하는 경우).

+0

그래서이 int 열을 하나의 datetime으로 변환합니까? – ExceptionLimeCat

0

C#에서 업데이트를 시도하는 것이 아니라 computed columncombinedDate으로 지정하면 어떨까요? DATETIMEFROMPARTS 내장 함수를 살펴 보자, 그것은

으로는 의견에서 지적 된 편집은 DATETIMEFROMPARTS는 SQL 서버 2012에서 사용할 수

, 여기에 대한 대안 방법입니다 유용 할 수 있습니다

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME) 
+0

그 매우 유용한 기능은 유감스럽게도 SQL Server ** 2012 **에서만 사용 가능합니다. 이전 버전이 아닌 ... –

+0

실제로 올바른지, 대체 문자를 추가하겠습니다. – kaveman

+1

다른 형식 : 'YY-MM-DD'형식 'SQL 서버에'DATETIME'을 생성하는 것은 안전하지 않습니다. 모든 언어 및 날짜 형식 설정에서 작동하지 않습니다. 'DATETIME'을 만들고 싶다면'YYYYMMDD' (**는 **없이 **)를 사용하거나, 'YYYY-MM-DDTHH : MM : SS'를 사용하여 모든 설정 하에서이 작업을해야합니다. –

1

다른 언급처럼 계산 된 열을 만드는 것이 더 나은 선택입니다. 이 접근법을 완전히 피하는 것이 더 좋을 것입니다. 그러나이 방법을 피할 수 없다면 다음과 같이 계산 된 열 식을 사용할 수 있습니다.

(dateadd(year, (100) + [year], 
    dateadd(month, [month] - (1), 
     dateadd(day, [day] - (1), 
      dateadd(hour, [hour], 
       dateadd(minute, [min], (0)) 
       ) 
      ) 
     ) 
    ) 
) 

샘플 스크립트 :

출력 섹션에서는 달 분에 잘못된 값이 실제로 미래

계산 열 표현에서 정확한 날짜를 표시하도록 추가 것을 알 수 있습니다

CREATE TABLE dbo.myTable 
(
     [year] int NOT NULL 
    , [month] int NOT NULL 
    , [day] int NOT NULL 
    , [hour] int NOT NULL 
    , [min] int NOT NULL 
    , [smalldatetime] AS (dateadd(year,(100)+[year],dateadd(month,[month]-(1),dateadd(day,[day]-(1),dateadd(hour,[hour],dateadd(minute,[min],(0))))))) PERSISTED 
); 

INSERT INTO dbo.myTable ([year], [month], [day], [hour], [min]) VALUES 
    (12, 4, 27, 17, 34), 
    (12, 6, 12, 4, 8), 
    (11, 32, 12, 54, 87); 

SELECT [year] 
    , [month] 
    , [day] 
    , [hour] 
    , [min] 
    , [smalldatetime] 
FROM dbo.myTable; 

샘플 출력 :

year month day hour min smalldatetime 
---- ----- --- ---- --- ----------------------- 
12 4  27 17 34 2012-04-27 17:34:00.000 
12 6 -12 4 8 2012-05-19 04:08:00.000 
11 32 12 54 87 2013-08-14 07:27:00.000 
관련 문제