यहां मेरा मुद्दा है: मेरे पास एक बड़ी क्वेरी है जिसे उस समय में दो तिथियां देखने के लिए खंड में तुलना करने की आवश्यकता है। मेरा वर्तमान समाधान, जो बेकार है, उसी दिन मध्यरात्रि में परिवर्तित करने के लिए डेटीम्स को एक यूडीएफ में भेजना है, और फिर उन तिथियों को समानता के लिए जांचें। जब क्वेरी प्लान की बात आती है, तो यह एक आपदा है, क्योंकि लगभग सभी यूडीएफ जुड़ने या क्लोज़ में हैं। यह मेरे एप्लिकेशन में एकमात्र जगहों में से एक है कि मैं फ़ंक्शंस को रूट करने में सक्षम नहीं हूं और क्वेरी ऑप्टिमाइज़र को कुछ ऐसा करने में सक्षम हूं जो वास्तव में सर्वोत्तम इंडेक्स का पता लगाने के लिए उपयोग कर सकता है।यह जांचने का एक अच्छा तरीका क्या है कि टीएसक्यूएल में एक ही कैलेंडर दिन पर दो डेटाटाइम हैं या नहीं?
इस मामले में, फ़ंक्शन कोड को वापस क्वेरी में विलय करना अव्यवहारिक लगता है।
मुझे लगता है कि मुझे यहां कुछ आसान याद आ रहा है।
यहां संदर्भ के लिए कार्य है।
where
dbo.f_MakeDate(dateadd(hh, tz.Offset +
case when ds.LocalTimeZone is not null
then 1 else 0 end, t.TheDateINeedToCheck), 0, 0) = @activityDateMidnight
[संपादित करें]
मैं:
if not exists (select * from dbo.sysobjects
where id = object_id(N'dbo.f_MakeDate') and
type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
exec('create function dbo.f_MakeDate() returns int as
begin declare @retval int return @retval end')
go
alter function dbo.f_MakeDate
(
@Day datetime,
@Hour int,
@Minute int
)
returns datetime
as
/*
Creates a datetime using the year-month-day portion of @Day, and the
@Hour and @Minute provided
*/
begin
declare @retval datetime
set @retval = cast(
cast(datepart(m, @Day) as varchar(2)) +
'/' +
cast(datepart(d, @Day) as varchar(2)) +
'/' +
cast(datepart(yyyy, @Day) as varchar(4)) +
' ' +
cast(@Hour as varchar(2)) +
':' +
cast(@Minute as varchar(2)) as datetime)
return @retval
end
go
मामलों को मुश्किल करने के लिए, मैं स्थानीय समय के खिलाफ की तारीख की जाँच करने के, जो हर पंक्ति के लिए अलग-अलग हो सकता है समय क्षेत्र टेबल पर शामिल होने हूँ @ टोड के सुझाव को शामिल कर रहा हूं:
where datediff(day, dateadd(hh, tz.Offset +
case when ds.LocalTimeZone is not null
then 1 else 0 end, t.TheDateINeedToCheck), @ActivityDate) = 0
मेरे बारे में गलतफहमी कैसे काम करती है (उसी दिन लगातार वर्षों में वर्ष 366 उत्पन्न होता है, जैसा कि मैंने अपेक्षित नहीं किया) ने मुझे बहुत सारे प्रयासों को बर्बाद कर दिया।
लेकिन क्वेरी योजना नहीं बदली। मुझे लगता है कि मुझे पूरी चीज के साथ ड्राइंग बोर्ड पर वापस जाने की जरूरत है।
कृपया मार्क ब्रैकेट का जवाब देखें, जो ** सही ** एक है। मुझे एहसास है कि आपका प्रश्न 2 साल पुराना है, लेकिन कृपया इस सवाल पर जाने वाले गलत रास्ते से लोगों को नेतृत्व न करें। टोड टिंगन का जवाब काम करता है लेकिन उस समय आपको लगता है कि भयानक प्रदर्शन है! – ErikE
मार्क का उत्तर इस स्थिति के लिए सही है क्योंकि अनुकूलक इस पर निर्भर करता है। जिस तरह से मैंने किया है डेटडैड का उपयोग करना एक सरल, संक्षिप्त तरीका है यह देखने के लिए कि क्या दो तिथियां उसी कैलेंडर दिन पर हैं, जो मूल प्रश्न था। – Todd