2009-05-04 4 views
51

मेरे पास एक संग्रहित प्रक्रिया है जो एक चयन कथन निष्पादित करती है। मैं अपने परिणामों को किसी दिनांक क्षेत्र द्वारा आदेशित करना चाहता हूं और सभी रिकॉर्ड्स को पहले और फिर सबसे हाल की तिथियों के साथ प्रदर्शित करता हूं।DATE तक आदेश सबसे पहले दिखा रहा है तो सबसे हालिया तिथियां

बयान इस तरह दिखता है:

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY [Submission Date] ASC 

अब इस सभी रिकॉर्ड शून्य प्रस्तुत फ़र्स्ट डेट्स के साथ प्रदर्शित होंगी, लेकिन जब मैं पंक्तियों कि उन में दिनांक मानों के लिए मिलता है, वे में सबसे हाल ही दिनांकों नहीं हैं दृश्य

यदि मैं डीईएससी के साथ एएससी को प्रतिस्थापित करता हूं, तो मुझे इच्छित क्रम में तिथियां मिलती हैं, लेकिन मेरे मूल्य सेट के नीचे नल मान हैं।

क्या मेरी क्वेरी को ढूढ़ने का कोई तरीका है ताकि मैं शीर्ष पर शून्य मान प्रदर्शित कर सकूं और फिर दिनांक मूल्यों को प्रदर्शित कर सकूं, ताकि उन्हें सबसे हालिया में सबसे हाल ही में उतरने का आदेश दिया जा सके?

उत्तर

85

@ क्रिस, आपके पास लगभग है।

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

[संपादित करें: #Eppz मेरे ऊपर के रूप में वर्तमान में प्रदर्शित कोड में और सुधार करने के लिए कहा]

मैं व्यक्तिगत रूप से इस एक बहुत "जादू संख्या" बनाने की तुलना में बेहतर पसंद करते हैं। जादू संख्या लगभग हमेशा होने वाली एक समस्या होती है।

+4

डीईएससी से परेशान क्यों? बस अपने 0 और 1. –

+0

को स्पष्ट रूप से स्विच करें, लेकिन मैं जितना संभव हो सके क्रिस के सुझाव के करीब अपने संपादन को रखने की कोशिश कर रहा था। –

+0

मैंने वास्तव में टैग को देखने के लिए यह नहीं देखा कि यह sql2000 के लिए था। मेरा MySQL में काम करना चाहिए। :) –

3

कोशिश

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC 
+0

9999/99/99 के साथ एक त्रुटि फेंक के रूप में यह एक तारीख को पार्स नहीं किया जा सकता है। – Eppz

+0

मैं इस मामले के बजाय इस समाधान का उपयोग करूंगा। – Ionic

+0

LINQ – yoohoo

21

इस तरह शून्य के डाल तल पर आप कुछ कर सकते हैं:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC 
+0

+1 में आसानी से उपयोग कर सकते हैं यह एकमात्र उत्तर था जो मेरे लिए एक्सेस एसक्यूएल में काम करता था। –

+1

यह SQLite में भी काम करता है। – IAmKale

+0

क्या आपके पास स्क्वायर कोष्ठक रखने का कोई कारण है? – AndrewBramwell

0

इस

का चयन एक, ख, ग, [प्रविष्टि की तिथि की कोशिश ] से कुछ देखें इस्नुल द्वारा ऑर्डर ([सबमिसी तिथि पर], कास्ट ('1770/01/01' डेटाटाइम के रूप में)) एएससी

+1

कास्ट के लिए धन्यवाद ('2079/01/01' डेटाटाइम के रूप में) भाग ! – Sadegh

14

मानक SQL (आईएसओ/आईईसी 9075-2: 2003 या बाद - 2008):

ORDER BY SomeColumn NULLS FIRST 

अधिकांश डीबीएमएस वास्तव में यह अभी तक, AFAIK का समर्थन नहीं करते के लिए प्रदान करता है।

+1

इस टिप के लिए धन्यवाद, ओरेकल 11 जी के साथ काम करता है। –

+2

पोस्टग्रेएसक्यूएल 9.2.1 के साथ भी काम कर रहा है। –

0

मैं जानता हूँ कि यह पुराना है, लेकिन जब मैं यह पाया मैं स्वीकार किए जाते हैं समाधान, https://stackoverflow.com/a/821856/7177892 देखा, मामला बयान हो या तो आज (GETDATE()) या वास्तविक तिथि का परिणाम बनाकर सरल किया जा सकता है।

मूल:

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

सरलीकृत:

ORDER BY (CASE WHEN [Submission Date] IS NULL 
       THEN GETDATE() 
       ELSE [Submission Date] 
      END) DESC 
+1

यह सरलीकरण इस तरह काम नहीं करेगा-अगर आपके पास आज की तारीख या भविष्य की तिथियों के साथ रिकॉर्ड हैं। उस स्थिति में, आप GETDATE() से DATEADD() में बदल सकते हैं और वर्तमान तारीख में कुछ दिनों या वर्षों की कुछ बड़ी संख्या जोड़ सकते हैं। – nconantj

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

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