एक डेटाटाइम कॉलम सेकंड की संख्या में परिवर्तित करें


11

मेरे SQL सर्वर डेटाबेस में, मेरे पास एक datetimeकॉलम है।

एक नया स्तंभ बनाने का एक अच्छा तरीका क्या है जो स्तंभ के लिए longमूल्य का प्रतिनिधित्व करता है datetime? यह longकई सेकंड का प्रतिनिधित्व करेगा।

मैंने सोचा कि अगर मैं इसे रूपांतरित कर सकता हूं longs, तो समय की अवधि में प्रश्नों द्वारा समूह बनाना आसान हो जाएगा, क्योंकि मैं लंबी संख्या को निश्चित मात्रा से विभाजित कर सकता था।

तालिका स्थिर है, डेटा को अपडेट या डिलीट नहीं किया जाएगा।

जवाबों:


13

एक नया कॉलम (ALTER TABLE) बनाएं, फिर उस पर एक UPDATE चलाएं

UPDATE
  MyTable
SET
  NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)

19000101SQL सर्वर युग है। आप 19700101उदाहरण के लिए यूनिक्स युग के लिए उपयोग कर सकते हैं


12

आप एक नया कॉलम जोड़ सकते हैं और मैन्युअल रूप से इसे अपडेट कर सकते हैं जैसा कि @ जीबीएन ने सुझाव दिया है, लेकिन अब आपको इस कॉलम को लगातार सम्मिलित / अपडेट ट्रिगर या किसी अन्य तंत्र के साथ अद्यतित रखना होगा। तालिका / स्तंभ नामों पर @ gbn के अनुमानों का उधार लेना, यहां विभिन्न दृष्टिकोणों की एक जोड़ी है, जिन्हें निरंतर रखरखाव की आवश्यकता नहीं है।

कंप्यूटेड कॉलम

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19000101', MyDateTimeColumn));

--or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19700101', MyDateTimeColumn));

आप इस कॉलम को स्टोर करने के लिए क्वेरी प्रदर्शन को बंद कर सकते हैं और अनुक्रमणित कर सकते हैं, लेकिन आपको गणना में थोड़ा बदलाव करने की आवश्यकता होगी (ऊपर बने रहने की कोशिश करने से गणना गैर-नियतात्मक होने के बारे में त्रुटि उत्पन्न होगी):

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 0, MyDateTimeColumn)) PERSISTED;

-- or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 25567, MyDateTimeColumn)) PERSISTED;

यदि आप लेखन प्रदर्शन (या संग्रहण) की तुलना में पढ़ने के प्रदर्शन के बारे में अधिक चिंतित हैं तो आप कॉलम को जारी रखना चाहेंगे।

राय

एक नए स्तंभ पर एक दृश्य का एक लाभ यह है कि आपको आधार तालिका स्कीमा को बदलना नहीं है (या इसे अद्यतित रखने की चिंता करें)। आप क्वेरी समय पर गणना की लागत का भुगतान करते हैं, जो कि एक गैर-निरंतर कम्प्यूटेड कॉलम के समान है।

CREATE VIEW dbo.vMyTable
AS
  SELECT -- other columns,
    MyDateTimeColumn,
    NewIntColumn = DATEDIFF(...whichever calc above makes sense...)
  FROM dbo.MyTable;

क्रम

चूँकि उपरोक्त गणना अत्यधिक जटिल नहीं हैं, बस गणना को अपनी क्वेरी में शामिल करें। उम्मीद है कि आप डेटा एक्सेस के लिए संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं ताकि आप इसे अक्सर दोहरा नहीं रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.