2009-08-04 5 views
14

이 코드를 작성하고 있습니다. 여기서 dt는 someint와 마찬가지로 함수에 입력됩니다. Exp 열은 Linq를 통해 DateTime으로 제공되는 T-SQL 날짜 열입니다.Linq에서 SQL에 날짜를 추가하는 방법

return (from a in dataContext.TableOfA 
     where a.name == "Test" && 
     a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
     select a).First(); 

C#에서는 날짜 시간에 하루를 두 번 추가 할 수 있습니다. 1.5 일을 더할 수 있다는 의미입니다. T-SQL에서는 1 일 추가 한 다음 12 시간 만 추가 할 수 있습니다. 각 파트에 int를 추가해야합니다. 그래서 Linq가 AddDays를 T-SQL로 변환하면 내 일수를 밀리 초로 변환하고 그 수를 더합니다. 이것은 double이 C#에주는 모든 정밀도를 제공합니다.

여기에 문지르 기가 있습니다. SQL에 도달하면 오류가 발생합니다.

The datepart millisecond is not supported by date function dateadd for data type date

기본적으로 밀리 초를 날짜에 추가 할 수 없습니다. 농담이 아니야. 그런데 어떻게 번역 할 수 있나요? 나는 int 일을 날짜에 추가하려고합니다. 비교 대상인 다른 사람에게 부정적인 것을 추가하려는 경우에만이 작업을 수행하고 싶습니까? 하나에 추가하는 동안 열과 비교하고 싶다면 어떻게해야합니까?

업데이트 1

Keith wrote, A command like datepart(millisecond, 10000, myDate) has been supported in T-SQL since at least SQL Server 2000. This error suggests that whatever database you are using does not support the millisecond date part, which seems strange to me.

나는 그것은 DATE 데이터 유형이 지원되지 않습니다 SQL Server 2008을 사용하고 있습니다. datetime에서 지원됩니다.

+0

적어도 SQL Server 2000 이후 T-SQL에서 datepart (millisecond, 10000, myDate)와 같은 명령이 지원되었습니다.이 오류는 사용중인 데이터베이스가 밀리 초 날짜 부분을 지원하지 않는다는 것을 나타내며 이상하게 보입니다 . – Keith

+0

DATE 데이터 유형에서는 지원되지 않습니다. datetime에서 지원됩니다. –

+0

그게 더 합리적입니다. DB 디자인을 제어 할 수 있다면 간단한 해결책은이 열을 DATE에서 DATETIME으로 변경하는 것입니다. 분명히 당신이이 질문을하고 있다면, 이것은 당신이 통제 할 수있는 것이 아닙니다. – Keith

답변

4

방금 ​​열을 DateTime으로 다시 변경했습니다.

당신은 두 날짜
0

기본적으로 int (일 수)와 날짜를 취하는 사용자 정의 함수를 작성한 것으로 생각하십니까? dateadd()의 결과를 반환합니까? 그런 다음 프로젝트의 LINQ 클래스로 가져옵니다. 그런 다음 .AddDate()를 호출하는 대신 UDF를 호출하십시오. 이렇게하면 수동으로 SQLCommand를 결합 할 필요없이 LINQ 쿼리의 모든 내용을 유지할 수 있습니다.

2

:

c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1) 
6

당신이 엔티티 프레임 워크를 사용하는 경우

을 비교하려는 경우 또한, SqlMethods.DateDiffDay 방법을 사용하여 아래와 같이 System.Data.Objects.EntityFunctions을 사용할 수 있습니다
3

당신은 .NET 부분에 SQL 부분에서 AddDays로 통화를 이동할 수 있습니다 :이 시나리오는 대부분 .NET 4.5을 고정처럼

a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint)) 
4

것 같다.

그러나 당신이 쓰는 경우 : 영업에 설명 된대로

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.Date.AddDays(7) select p; 

당신은 같은 오류 메시지가 표시됩니다.

그러나, 당신은 작성하는 경우 :

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.AddDays(7) select p; 

이 그럼 당신은 젖과 꿀의 땅을 입력 할 수 있습니다. 데이터베이스의 DateTime 표현에서 .Date를 호출하지 않았습니다. 이것은 4에서 LINQ 2 SQL 프레임 워크에 의한 테스트 커버리지가 누락 된 경우입니다.

+4

.NET 4.5.1을 사용하고 있으며 두 시나리오 모두 "LINQ에서 지원되지 않음"오류가 발생했습니다. – mgrenier

3

5는 새로운 DateTime 객체를 생성하고 그 후 AddDays 방법을 사용하려면 먼저 대신 Linq에 프로세스 LINQ 쿼리에 SQL 쿼리를 변경한다면

new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx) 
-2

좋은 생각이 될 수 있습니다.

그냥 당신이 당신이 더 effectivly 내가 생각 처리 할 수 ​​Linq에있는 모든 물건을 가지고 그래서 일단 기록을

return (from a in dataContext.TableOfA.ToList() 
    where a.name == "Test" && 
    a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
    select a).First(); 

을 ToList()를 추가하거나 제한 할 수 있습니다.

건배

0

당신은 사용할 수 있습니다 System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays)이 기능은 유효한 SQL 쿼리로 변환됩니다. AddDays 함수도 포함하는 클래스 System.Data.Entity.Core.Objects.EntityFunctions은 더 이상 사용되지 않습니다.

관련 문제