2009-08-04 12 views
14

में दिन-प्रतिदिन जोड़ने के लिए मैं इस कोड को लिख रहा हूं। यहां डीटी फ़ंक्शन में इनपुट है, साथ ही साथ कुछ भी है। कॉलम एक्सप एक टी-एसक्यूएल दिनांक कॉलम है, जो लिंक के माध्यम से डेटटाइम के रूप में आता है।लिंक से एसक्यूएल

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

सी # में, आप एक दिन के रूप में एक दिन के रूप में एक डबल जोड़ सकते हैं। मतलब आप 1.5 दिन जोड़ सकते हैं। टी-एसक्यूएल में आप केवल 1 दिन जोड़ सकते हैं, फिर 12 घंटे। आपको प्रत्येक भाग के लिए एक int जोड़ना होगा। तो जब लिंकक टी-एसक्यूएल में एडडेज़ का अनुवाद करता है, तो यह मेरे दिनों की संख्या मिलीसेकंड में परिवर्तित करता है, और उनको जोड़ता है। यह इसे सभी सटीकता देता है जो डबल को सी # देता है।

यहां रगड़ है। जब यह 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.

कृपया ध्यान दें मैं एसक्यूएल सर्वर 2008 यह DATE डेटा प्रकार पर समर्थित नहीं है का उपयोग कर रहा हूँ। यह डेटाटाइम पर समर्थित है।

+0

कम से कम SQL Server 2000 से टी-एसक्यूएल में डेटपार्ट (मिलीसेकंड, 10000, myDate) जैसे कमांड को समर्थित किया गया है। यह त्रुटि बताती है कि जो भी डेटाबेस आप उपयोग कर रहे हैं वह मिलीसेकंद दिनांक भाग का समर्थन नहीं करता है, जो मुझे अजीब लगता है । – Keith

+0

यह DATE डेटा प्रकार पर समर्थित नहीं है। यह डेटाटाइम पर समर्थित है। –

+0

यह अधिक समझ में आता है। खैर यदि आपके पास डीबी डिज़ाइन पर नियंत्रण है, तो सरल समाधान इस कॉलम को DATE से एक DATETIME में बदलना होगा। जाहिर है अगर आप इस सवाल से पूछ रहे हैं, तो ऐसा कुछ नहीं है जिस पर आपका नियंत्रण है? – Keith

उत्तर

4

मैंने अभी कॉलम को डेटटाइम में बदल दिया है।

0

क्या आपने अपना स्वयं का उपयोगकर्ता परिभाषित फ़ंक्शन लिखने पर विचार किया है जो मूल रूप से एक int (दिनों की संख्या के लिए) और तिथि लेता है, डेटडैड() के परिणाम देता है? फिर इसे अपनी परियोजना में LINQ कक्षा में खींचें। फिर, कॉल करने के बजाय .ddDate(), अपने यूडीएफ को कॉल करें - यह आपको SQLLommand को मैन्युअल रूप से टुकड़े किए बिना अपने LINQ क्वेरी में सबकुछ रखने की अनुमति देगा।

2

तुम भी SqlMethods.DateDiffDay विधि का उपयोग कर सकते हैं, अगर आप दो तिथियों

6

आप इकाई की रूपरेखा का उपयोग कर रहे हैं, तो तुलना करने के लिए कोशिश कर रहे हैं, जैसा कि नीचे System.Data.Objects.EntityFunctions का उपयोग करें:

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

आप नेट हिस्से के लिए एसक्यूएल हिस्से से AddDays करने के लिए कॉल स्थानांतरित कर सकते हैं:

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

ऐसा लगता है कि इस परिदृश्य ज्यादातर .NET 4.5 में तय हो गई है।

हालांकि, अगर आप लिखें:

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; 

तो फिर तुम दूध और शहद की भूमि में प्रवेश कर सकते हैं। ध्यान दें कि मैंने कॉल नहीं किया था। डेटाबेस के डेटटाइम प्रतिनिधित्व पर दिनांक। यह 4 में LINQ 2 एसक्यूएल फ्रेमवर्क द्वारा एक बढ़त मामला गायब परीक्षण कवरेज प्रतीत होता है।5

+4

मैं .NET 4.5.1 का उपयोग कर रहा हूं और दोनों परिदृश्यों में आपने मुझे "LINQ द्वारा समर्थित नहीं" त्रुटि दी है – mgrenier

3

एक नया DateTime वस्तु बना सकते हैं और उसके बाद AddDays विधि का उपयोग करें: यदि आप पहले के बजाय Linq और इस प्रक्रिया LINQ क्वेरी के साथ आपके SQL क्वेरी बदल जाएगा

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

अच्छा विचार हो सकता है।

बस ToList()

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

जोड़ सकते हैं या सीमित कर रिकॉर्ड तो एक बार आप Linq अपनी हर चीज़ तो आप अधिक effectivly मुझे लगता है कि प्रक्रिया कर सकते हैं।

चीयर्स

0

आप उपयोग कर सकते हैं: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays) इस समारोह वैध एसक्यूएल क्वेरी के लिए अनुवाद किया जाएगा। कक्षा System.Data.Entity.Core.Objects.EntityFunctions जिसमें एडडेज़ फ़ंक्शन भी शामिल है अप्रचलित है।

संबंधित मुद्दे