SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
मुझे मिला
"अमान्य कॉलम नाम दिनोंदिफ"।
Maxlogtm एक डेटाइम फ़ील्ड है। यह थोड़ा सामान है जो मुझे पागल कर देता है।
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
मुझे मिला
"अमान्य कॉलम नाम दिनोंदिफ"।
Maxlogtm एक डेटाइम फ़ील्ड है। यह थोड़ा सामान है जो मुझे पागल कर देता है।
जवाबों:
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
आम तौर पर आप WHEREखंड में क्षेत्र उपनामों का उल्लेख नहीं कर सकते । (इसे SELECTउपनाम सहित संपूर्ण के रूप में सोचो , के बाद लागू किया जाता हैWHERE क्लॉज के ।)
लेकिन, जैसा कि अन्य उत्तरों में बताया गया है, आप SQL को क्लॉज़ SELECTसे पहले संभाला जाने के लिए बाध्य कर सकते हैं WHERE। यह आमतौर पर कोष्ठक के साथ ऑपरेशन के तार्किक क्रम को लागू करने के लिए या एक सामान्य तालिका अभिव्यक्ति (CTE) के साथ किया जाता है:
कोष्ठक / सबसिलेक्ट:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
या उसी के सीटीई संस्करण के लिए एडम का जवाब देखें।
HAVINGसवाल एमएस-एसक्यूएल सहित अधिकांश एसक्यूएल वातावरण में काम नहीं करता है, जिसके बारे में यह सवाल है। (टी-एसक्यूएल में, HAVINGएक समग्र फ़ंक्शन की आवश्यकता होती है।)
यदि आप अपने WHEREउपवाक्य में उपनाम का उपयोग करना चाहते हैं , तो आपको इसे उप-चयन या सीटीई में लपेटने की आवश्यकता है :
WITH LogDateDiff AS
(
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120
अपने कोड को दोहराए बिना इसे करने का सबसे प्रभावी तरीका WHERE के बजाय HAVING का उपयोग है
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
HAVINGउपनाम का उपयोग मानक नहीं है (यह MySQL पर काम करता है, हालांकि)। विशेष रूप से, मुझे लगता है कि यह SQL सर्वर के साथ काम नहीं करता है।
[S0001][207] Invalid column name 'daysdiff'
[S0001][8121] Column 'day' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
यदि आप CTE में अपने सभी कॉलमों को सूचीबद्ध नहीं करना चाहते हैं, तो इसका उपयोग करने का एक और तरीका होगा outer apply:
select
s.logcount, s.logUserID, s.maxlogtm,
a.daysdiff
from statslogsummary as s
outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120
आप स्तंभ उपनाम का उल्लेख कर सकते हैं, लेकिन आपको इसका उपयोग करने की आवश्यकता है CROSS/OUTER APPLY:
SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;
पेशेवरों:
WHERE/GROUP BY/ORDER BYsql-serverऔर t-sql:)
यहाँ आया है कि करने के लिए कुछ इसी तरह की तलाश में है, लेकिन एक मामले के साथ कब, और कहां इस तरह का उपयोग कर समाप्त: WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0हो सकता है आप इस्तेमाल कर सकते हैं DATEDIFFमें WHEREसीधे। कुछ इस तरह:
SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
`daysdiff`।