SQL सर्वर DateTime डेटाटाइप से केवल दिनांक कैसे वापस करें


1777
SELECT GETDATE()

यह दिखाता है: 2008-09-22 15:24:13.790

मैं समय भाग के बिना वह तिथि भाग चाहता हूं: 2008-09-22 00:00:00.000

मुझे वह कैसे मिल सकता है?


4
यदि आप समय के बिना डेट डेटाइप प्राप्त करना चाह रहे हैं, भले ही समय 00:00:00 है, तो आप भाग्य से बाहर हैं, आप एक वर्चर प्राप्त कर सकते हैं, लेकिन संरचना एक डेटाइम है और आपके पास हमेशा कुछ समय होगा।
क्विंटन रॉबिन्सन

16
ध्यान देने वाली एक बात यह है कि SQL Server 2008 में समय घटक के बिना सिर्फ दिनांक संग्रहीत करने के लिए एक अलग DATE डेटाटाइप शामिल है। यहाँ अधिक जानकारी: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
बेन हॉफस्टीन

7
विभिन्न समय-हटाने के तरीकों के प्रदर्शन परीक्षण के परिणाम दिखाने वाली इस पोस्ट को याद न करें ।
एरिक

18
मतों से भ्रमित न हों और उत्तर स्वीकार करें, stackoverflow.com/a/126984/1155650
रोहित विपिन मैथ्यूज

8
@ रोहित आप गलत मान रहे हैं कि 2008 ही एकमात्र ऐसा संस्करण है जिसके बारे में लोग ध्यान रखते हैं। (जंगली में अधिक संस्करण हैं।) वोट खुद के लिए बोलते हैं।
hktegner

जवाबों:


2486

पर SQL Server 2008और अधिक है, आपको चाहिए CONVERTतारीख को:

SELECT CONVERT(date, getdate())

पुराने संस्करणों पर, आप निम्न कार्य कर सकते हैं:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

उदाहरण के लिए

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

मुझे देता है

2008-09-22 00:00:00.000

पेशेवरों:

  • कोई varchar<-> datetimeरूपांतरण आवश्यक है
  • सोचने की जरूरत नहीं locale

जैसा कि माइकल द्वारा सुझाया गया है

इस संस्करण का उपयोग करें: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

आउटपुट:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000

52
+1 ऐसा लगता है कि आमतौर पर उपयोग की जाने वाली डबल कन्वर्ट () विधि की तुलना में यह 35% तेज है (जिसका उपयोग मैंने वर्षों से भी किया है)। अच्छा है।
डेन

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

38
@pilavdzice उस दिन की आधी रात को एक datetime स्थापना करता अवकाश बंद टाइम। आप किस परिणाम की उम्मीद कर रहे हैं? datetimeडेटा प्रकार नहीं हो सकता सब पर कोई समय । मुझे लगता है कि आप उपयोगकर्ता प्रस्तुति के साथ डेटा स्टोरेज को भ्रमित कर रहे हैं। यदि आप चाहते हैं कि एक उपयोगकर्ता को एक स्ट्रिंग दिखाने का एक तरीका है जिसमें कोई समय भाग नहीं है (शून्य नहीं है, सिर्फ रिक्त है) तो आप बस चाहते हैं Convert(varchar(30), @Date, 101)या कुछ इसी तरह। SQL सर्वर पुस्तकें ऑनलाइन देखें • कास्ट करें और अधिक जानकारी के लिए कनवर्ट करें
एरिक

7
@ user1671639 डेटाटाइम डेटा प्रकार में हमेशा दिनांक और समय दोनों होते हैं, आप समझदारी से एक के बिना एक को स्टोर नहीं कर सकते हैं - जब तक आप SQL सर्वर 2008 का उपयोग नहीं कर रहे हैं, उस स्थिति में अलग 'तारीख' और 'समय' डेटा भी हैं प्रकार के। यदि आप इस तरह CONVERT () का उपयोग करते हैं, तो आप वास्तव में बाद में उपयोग के लिए एक स्ट्रिंग चाहते हैं, तो आप इसे इस तरह से करते हुए फंस जाएंगे - हालाँकि यह बेहतर होगा यदि आप तारीख को काटने के बजाय दिनांक स्वरूपण फ़ंक्शन का उपयोग करते हैं - या के माध्यम से CAST(... AS DATE)या CONVERT(DATE, ...), जिसका उल्लेख इस पृष्ठ पर अक्सर किया गया है।
मैग्नस

10
मैं इसका उत्तर बदलने की सलाह देता हूं SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)क्योंकि तब ddकिसी अन्य datepartकीवर्ड के लिए आपके datetimeमनमाने स्तर पर छांटने के लिए स्वैप किया जा सकता है।
माइकल - कहाँ है क्ले शिर्क

717

SQLServer 2008 में अब एक 'दिनांक' डेटा प्रकार होता है जिसमें केवल एक दिनांक होती है जिसमें कोई समय घटक नहीं होता है। SQLServer 2008 और उसके बाद का उपयोग करने वाला कोई भी व्यक्ति निम्नलिखित कार्य कर सकता है:

SELECT CONVERT(date, GETDATE())

41
SQL2008 में 'समय' डेटा प्रकार भी है जो तिथि और समय को अलग करने के प्रश्न के अन्य आधे का जवाब देता है।
मिस्टरएडैन

8
FYI करें, मैंने तिथियों को समय से अलग करने के विभिन्न तरीकों को बेंचमार्क किया और यह सबसे तेज़ तरीका था। दी गई अंतर छोटा था, लेकिन यह स्पष्ट रूप से निष्पादन के एक बड़े # पर तेजी से था।
UnhandledExcepSean

2
2005 sqlserver के बारे में?
डॉ। एमएएफ

@ Dr.MAF सर्कल पूरा करते हुए, 2008 से पहले का उत्तर यहां दिया गया है: stackoverflow.com/questions/113045/…
Frosty840

170

यदि SQL 2008 और इसके बाद के संस्करण का उपयोग कर रहे हैं:

select cast(getdate() as date)

3
@FredrickGauss: किस प्रकार, दिनांक? SQL सर्वर के किस संस्करण का आप उपयोग करते हैं?
abatishchev

7
सावधान रहें! घोषित @ तारीख 1 डेटाइम = '2015-09-30 20: 59: 59.999'; कास्ट (@ तारीख 1 तारीख के रूप में) '2015-10-01' रिटर्न
निक

6
@ निक: यह डेटटाइम के साथ मुद्दा है। DateTime2इसके बजाय उपयोग करें और यह ठीक काम करता है। sqlfiddle.com/# -6
9eecb7/

8
@Nick, abatishchev प्रतिक्रिया के पूरक के लिए, आपका @ तारीख 1 वास्तव में सीमाओं के 2015-10-01कारण है DateTime। किसी भी कलाकारों के बिना Date, यह 2015-10-01भी पैदावार की कोशिश करो ! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric

4
SQL ट्रिक्स को याद रखना आसान है। जैसा कि माइक कहते हैं, केवल 2008 आगे, लेकिन, यदि आप 2005 और पिछले डीबी को कहीं पाते हैं, तो आपके पास बहुत सारे मुद्दे हो सकते हैं :)
निकोवेराज़

73

DATEADD और DATEDIFF, वरचेरिंग से बेहतर है। दोनों प्रश्नों में एक ही निष्पादन योजना है, लेकिन निष्पादन योजनाएं मुख्य रूप से डेटा एक्सेस रणनीतियों के बारे में हैं और सभी टुकड़ों को निष्पादित करने के लिए हमेशा सीपीयू समय में शामिल निहित लागत को प्रकट नहीं करते हैं। यदि दोनों क्वेरीज़ को लाखों पंक्तियों वाली तालिका के विरुद्ध चलाया जाता है, तो DateDiff का उपयोग करने वाला CPU समय Convert CPU समय के 1 / 3rd के करीब हो सकता है!

प्रश्नों के लिए निष्पादन योजना देखने के लिए:

set showplan_text on
GO 

DATEADD और DatedIFF दोनों एक CONVERT_IMPLICIT को क्रियान्वित करेंगे।

हालांकि CONVERT समाधान सरल और पढ़ने में आसान कुछ के लिए है, यह है धीमी। डेटाटाइम में वापस जाने की आवश्यकता नहीं है (यह सर्वर द्वारा किया गया है)। DateAdd के लिए DateDiff पद्धति में भी कोई वास्तविक आवश्यकता नहीं है क्योंकि पूर्णांक परिणाम भी अनुमानित रूप से वापस डेटाटाइम में परिवर्तित हो जाएगा।


कनेक्ट कंवर्ट (varchar, MyDate, 101) DatesTable से

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

DATEADD का चयन करें (dd, 0, DatedIFF (dd, 0, MyDate)) DatesTable से

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

@Digi के रूप में FLOOR () का उपयोग करने से डेटडिफ़ के करीब प्रदर्शन होता है, लेकिन फ्लोट करने के लिए डेटाइम डेटा प्रकार को कास्टिंग के रूप में अनुशंसित नहीं किया जाता है और हमेशा मूल मूल्य प्राप्त नहीं होता है।

याद रखें दोस्तों: किसी पर विश्वास न करें। प्रदर्शन के आँकड़ों को देखें, और इसे स्वयं परखें!

जब आप अपने परिणामों का परीक्षण कर रहे हों तो सावधान रहें। क्लाइंट के लिए कई पंक्तियों का चयन करने से प्रदर्शन अंतर छिप जाएगा क्योंकि गणनाओं को निष्पादित करने के लिए नेटवर्क पर पंक्तियों को भेजने में अधिक समय लगता है। इसलिए सुनिश्चित करें कि सभी पंक्तियों के लिए कार्य सर्वर द्वारा किया जाता है लेकिन क्लाइंट को कोई पंक्तियाँ नहीं भेजी जाती हैं।

जब कैश ऑप्टिमाइज़ेशन प्रश्नों को प्रभावित करता है, तो कुछ लोगों के लिए भ्रम की स्थिति प्रतीत होती है। एक ही बैच में या अलग-अलग बैच में दो क्वेरी चलाने से कैशिंग पर कोई प्रभाव नहीं पड़ता है। तो आप या तो कैश को मैन्युअल रूप से समाप्त कर सकते हैं या केवल प्रश्नों को कई बार आगे-पीछे चला सकते हैं। क्वेरी # 2 के लिए कोई भी अनुकूलन किसी भी बाद के प्रश्नों को प्रभावित करेगा, इसलिए यदि आप चाहें तो निष्पादन # 1 को बाहर फेंक दें।

यहां पूर्ण परीक्षण स्क्रिप्ट और प्रदर्शन परिणाम हैं जो साबित करते हैं कि डेटडिफ़ को वार्चर में परिवर्तित करने की तुलना में काफी तेज है।


रिकार्डो सी, अच्छी जांच! SQL सर्वर के किस संस्करण का आप उपयोग करते हैं? दिनांकित के साथ MSSQL2000 विधि मेरे लिए थोड़ा तेज प्रदर्शन करती है।
एक्यू

बस ध्यान देने के लिए, मैंने 1000.000 बार परीक्षण किया। के लिए व्यावहारिक परिदृश्यों में प्रदर्शन अंतर ध्यान देने योग्य नहीं होगा, मुझे लगता है
अकु

अकु, मैंने इस परीक्षण के लिए SQL सर्वर 2005 एक्सप्रेस का उपयोग किया। मैं काम पर 2000 पर काम करता हूं, और मैं इसे 24 मिलियन पंक्तियों के साथ एक तालिका के साथ परीक्षण करूंगा और देखूंगा कि इसमें से क्या निकलता है।
रिकार्डो सी।

अकु, वही परिणाम। दस लाख पंक्तियों के प्रदर्शन में कोई अंतर नहीं है।
रिकार्डो सी।

5
समान प्रदर्शन के बारे में दावे सही नहीं हैं। बेशक निष्पादन योजनाएं समान होंगी !!! इन MUST पर प्रदर्शन का मापन सीपीयू के उपयोग की तुलना करके किया जाना चाहिए, निष्पादन योजनाओं की जांच नहीं।
ErikE

51

इसे इस्तेमाल करे:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

उपर्युक्त कथन आपके वर्तमान प्रारूप को परिवर्तित करता है YYYY/MM/DD, कृपया अपना पसंदीदा प्रारूप चुनने के लिए इस लिंक को देखें ।


5
यह मेरे लिए '
2008/09/22

1
Select CONVERT (VARCHAR (10), GETDATE (), 101) mm/dd/yyyyप्रारूप है।
पिस्सू

4
यदि आप कच्चे पाठ मूल्य (डीबी के बाहर) के आधार पर छंटनी कर रहे हैं तो 'जापानी' प्रारूप बेहतर है
साइमन_ वीवर


21

फॉर्मेट में वापसी के लिए

CAST (आदेश तिथि के अनुसार)

उपरोक्त कोड sql सर्वर 2010 में काम करेगा

यह 12/12/2013 की तरह लौटेगा

SQL सर्वर 2012 के लिए नीचे दिए गए कोड का उपयोग करें

CONVERT(VARCHAR(10), OrderDate , 111)

1
यह रिटर्न मुझे शून्य समय के साथ तारीख, न सिर्फ तारीख
बोहेमियन

1
क्या मैं जान सकता हूं कि यदि आप जिस SQL ​​सर्वर का उपयोग कर रहे हैं, वह कौन सा संस्करण है?
महेश एमएल

1
@MaheshML यह एमएस एसक्यूएल 2012 में दोनों की तारीख और समय रिटर्न
मारेक

1
SQL Azure में एक आकर्षण की तरह काम करता है
Martin Coll

5
@MaheshML SQL Server 2010 जैसी कोई चीज नहीं है।
स्वेलेन्टरमैन

21

आप CONVERTकेवल दिनांक को वापस करने के लिए फ़ंक्शन का उपयोग कर सकते हैं । नीचे दिए गए लिंक को देखें:

SQL सर्वर 2000 में दिनांक और समय हेरफेर

CAST और CONVERT

कन्वर्ट फ़ंक्शन का उपयोग करने के लिए सिंटैक्स है:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

16

यदि आपको ए के रूप में परिणाम की आवश्यकता है varchar, तो आपको गुजरना चाहिए

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

जो पहले ही ऊपर उल्लेखित है।

यदि आपको दिनांक और समय प्रारूप में परिणाम की आवश्यकता है, तो आपको नीचे दिए गए किसी भी प्रश्न का उपयोग करना चाहिए

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 

    2014-03-26 00: 00: 00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 

    2014-03-26 00: 00: 00.000

  3. DECLARE  @OnlyDate DATETIME
    SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
    SELECT @OnlyDate AS OnlyDate

    2014-03-26 00: 00: 00.000


14
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

13

FLOOR () का उपयोग करना - बस समय भाग को काटें।

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

4
यह विधि सबसे तेज़ नहीं है, और यह भी स्पष्ट रूप से लोगों को सिखाता है कि तैरने के लिए कास्टिंग की तारीख सटीक है, जो यह नहीं है। कृपया इस पोस्ट को और अधिक विस्तार से देखें।
ErikE

13

यदि आप SQL Server 2012 या इसके बाद के संस्करण का उपयोग कर रहे हैं ,

Format()फ़ंक्शन का उपयोग करें ।

SQL सर्वर के लिए पहले से ही कई उत्तर और स्वरूपण प्रकार हैं। लेकिन अधिकांश विधियां कुछ अस्पष्ट हैं और आपके लिए प्रारूप प्रकार या फ़ंक्शन के लिए संख्याओं को याद रखना मुश्किल होगा, जो दिनांक प्रारूप के संबंध में हैं। इसलिए SQL सर्वर के अगले संस्करणों में बेहतर विकल्प है।

FORMAT ( value, format [, culture ] )

संस्कृति विकल्प बहुत उपयोगी है, क्योंकि आप अपने दर्शकों के अनुसार तिथि निर्दिष्ट कर सकते हैं।

आपको डी (छोटे पैटर्न के लिए) और डी (लंबे पैटर्न के लिए) याद रखना होगा।

1. "डी" - लघु तिथि पैटर्न।

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "डी" - लंबी तारीख का पैटर्न।

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

क्वेरी में और उदाहरण।

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011101

यदि आप अधिक प्रारूप चाहते हैं, तो आप यहां जा सकते हैं:

  1. मानक दिनांक और समय प्रारूप स्ट्रिंग्स
  2. कस्टम दिनांक और समय प्रारूप स्ट्रिंग्स

12

यदि आप CONVERT का उपयोग करना चाहते हैं और मूल आउटपुट के रूप में वही आउटपुट प्राप्त करना चाहते हैं, जो कि, yyyy-mm-dd है, तो CONVERT(varchar(10),[SourceDate as dateTime],121)पिछले कोड के उत्तर के समान कोड का उपयोग करें , लेकिन डैश के साथ yyyy-mm-dd में कनवर्ट करने के लिए कोड है 121।

अगर मैं अपने सोपबॉक्स पर एक सेकंड के लिए प्राप्त कर सकता हूं, तो इस तरह का स्वरूपण डेटा टियर में नहीं होता है , और यही कारण है कि वास्तविक दिनांकित डेटा प्रकार होने पर SQL सर्वर 2008 तक मूर्खतापूर्ण उच्च-ओवरहेड 'ट्रिक्स' के बिना यह संभव नहीं था। की शुरुआत की। डेटा टियर में इस तरह के रूपांतरण करना आपके DBMS पर ओवरहेड की एक बड़ी बर्बादी है, लेकिन इससे भी महत्वपूर्ण बात यह है कि दूसरा आप कुछ इस तरह से करते हैं, आपने मूल रूप से इन-मेमोरी अनाथ डेटा बनाया है जो मुझे लगता है कि आप एक कार्यक्रम में वापस आ जाएंगे। आप इसे वापस किसी अन्य 3NF + कॉलम में नहीं डाल सकते हैं या इसकी पुनरावृत्ति के बिना टाइप किए गए किसी भी चीज़ से तुलना कर सकते हैं, इसलिए आपने जो कुछ भी किया है वह विफलता के बिंदुओं को प्रस्तुत किया है और संबंधपरक संदर्भ को हटा दिया है।

आपको हमेशा आगे बढ़ना चाहिए और अपने डेटटाइम डेटा प्रकार को कॉलिंग प्रोग्राम में और PRESENTATION tier में वापस करना चाहिए , जो भी समायोजन आवश्यक हो, करें। जैसे ही आप कॉल करने वाले को वापस करने से पहले चीजों को रूपांतरित करते हैं, आप एप्लिकेशन से सभी संदर्भात्मक अखंडता की उम्मीद को हटा रहे हैं। यह तब तक एक अद्यतन या DELETE कार्रवाई को रोक देगा, जब तक कि आप किसी प्रकार का मैनुअल उलट नहीं करते हैं, जो फिर से आपके डेटा को मानव / कोड / ग्रेमलिन त्रुटि को उजागर कर रहा है जब कोई आवश्यकता नहीं होती है।


1
को छोड़कर, कहते हैं, यदि आप एक क्वेरी चाहते हैं जो एक निश्चित समय क्षेत्र के दिनांक-भाग के रूप में उपयोगकर्ता-आपूर्ति की तारीख से मेल खाते सभी रिकॉर्डों को पुनर्प्राप्त करता है । सौभाग्य केवल प्रस्तुति परत में है। (आपको रूपांतरण की आवश्यकता नहीं है, आप तिथि अंकगणित का उपयोग कर सकते हैं, लेकिन आपको यह विचार मिलता है ...)
एंड्रयू लाजर

1
@ और क्यों बात करता है? आप कहते हैं WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- कॉलम से समय निकालने का कोई कारण नहीं है।
हारून बर्ट्रेंड

1
@AaronBertrand केवल यह मानते हुए कि @Dateशून्य काल भाग में इनपुट काम करता है । यदि यह सच नहीं है, तो आपको अभी भी यह जानने की जरूरत है कि सर्वर-साइड को कैसे ट्रंक किया जाए। मैं इस जवाब से सहमत हूं कि फ़ॉर्मेटिंग को प्रस्तुति परत पर छोड़ दिया जाना चाहिए, लेकिन मैं इस निहितार्थ से सहमत नहीं था कि आगे के अंत के लिए छोड़ने का मतलब है कि आपको ट्रंक करने का एक त्वरित तरीका जानने की ज़रूरत नहीं है।
एंड्रयू लाजर 17

1
@ और आपको जो कुछ करना है, वह इनपुट पैरामीटर DATE है। मेरा कहना अभी भी है कि आपको कभी भी इस तरह के किसी भी प्रकार के स्तंभ को लागू नहीं करना चाहिए , भले ही वह अधिकांश लोगों की पहली वृत्ति हो।
हारून बर्ट्रेंड

1
@AaronBertrand और मान लिया कि आपके पास पैरामीटर के डेटाटाइप पर नियंत्रण है। एक संग्रहीत प्रक्रिया में ठीक है, अन्य स्थितियों में ऐसा संभव नहीं है। यह सुनिश्चित करने के लिए क्यों नहीं कि पैरामीटर वह प्रकार है जो आप चाहते हैं और आवश्यकता है?
एंड्रयू लाजर

10
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

संपादित करें: पहले दो तरीके अनिवार्य रूप से समान हैं, और बाहर कन्वर्ट करने के लिए varchar विधि करते हैं।


1
ये तरीके सभी महान हैं, लेकिन आप किस एकल का उपयोग करने का सुझाव देते हैं?
एडीग्रोव्स

3
ध्यान दें कि शीर्ष दो का "सही" संस्करण है select dateadd(dd, datediff(dd, 0, getdate()), 0), क्योंकि ddएस को फिर से किसी के लिए भी स्वैप किया जा सकता हैdatepart कीवर्ड किसी भी खंड आप चुनते हैं पर तारीख क्लिप करने के लिए। (यह भी ध्यान दें कि ddयह केवल एक संक्षिप्त नाम है day।)
माइकल - जहां क्ले शिर्क

10

संकेतित परिणाम प्राप्त करने के लिए, मैं निम्नलिखित कमांड का उपयोग करता हूं।

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

मुझे लगता है कि यह उपयोगी है।



7

यदि आप किसी कॉलम या वैरिएबल पर परिणाम दे रहे हैं, तो इसे DATE प्रकार दें, और रूपांतरण निहित है।

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

6

मुझे लगता है कि यह आपके मामले में काम करेगा:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

2
इस सुझाव को अन्य उत्तरों (एक से अधिक बार) द्वारा कवर किया गया है।
एंड्री एम

6

ठीक है, हालांकि मैं थोड़ा देर से :), यहाँ एक और समाधान है।

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

परिणाम

2008-09-22 00:00:00.000

और यदि आप SQL Server 2012 और उच्चतर का उपयोग कर रहे हैं तो आप FORMAT()इस तरह से फंक्शन का उपयोग कर सकते हैं -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')

आपके पहले उदाहरण में अभी भी एक समय घटक है। सवाल का मुद्दा यह था कि इसे कैसे हटाया जाए।
ज़ैक

5

यहां तक ​​कि प्राचीन MSSQL सर्वर 7.0 का उपयोग करते हुए, यहां कोड (इस लिंक के सौजन्य से ) ने मुझे उस समय के लिए जो भी तारीख का प्रारूप मिल रहा था, प्राप्त करने की अनुमति दी:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

इसने इस उत्पादन का उत्पादन किया:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

5

तारीख:

सेनेट कंवर्ट (तारीख, GETDATE) ()
चयन तिथि (तिथि के अनुसार) ()

समय:

सेनेट कंवर्ट (समय, GETDATE) (114)
सेलेक्ट कास्ट (GETDATE () समय के अनुसार)

5

बस आप इस तरह से कर सकते हैं:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

आउटपुट के रूप में:

2008-09-22 00:00:00.000

या बस इस तरह से करें:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

परिणाम:

Date Part Only
--------------
2013-07-14

4

आप DATE_FORMAT (your_datetiem_column, '% d-% m-% Y) का उपयोग क्यों नहीं करते?

पूर्व: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

आप फिर से व्यवस्थित कर प्राप्त की मीटर, डी और साल अनुक्रम को बदल सकते हैं '%d-%m-%Y'हिस्सा


4

मुझे पता है कि यह पुराना है, लेकिन मैं यह नहीं देखता कि किसी ने इसे इस तरह कहां कहा है। मैं जो बता सकता हूं, यह एएनएसआई मानक है।

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

यदि Microsoft ANSI मानक CURRENT_DATE चर का भी समर्थन कर सकता है तो अच्छा होगा।


select {fn current_date()} as todayमेरे लिये कार्य करता है।
१ary:२६ को

@baryary - यह अच्छा है, लेकिन यह ANSI SQL नहीं है।
जलाया

यह काफी उचित है, और आपका उत्तर अच्छी तरह से पोर्टेबल है, लेकिन मुझे लगा कि जब तक हम टी-एसक्यूएल के आसपास काम कर रहे हैं, यह भी काम करता है (और दिखाता है कि एएनएसआई CURRENT_DATE को लागू करना एमएस के लिए तुच्छ होगा)।

4

मैं निम्नलिखित का पक्ष लेता हूं जिसका उल्लेख नहीं किया गया था:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

यह स्थानीय के बारे में भी परवाह नहीं करता है या एक डबल कन्वर्ट नहीं करता है - हालांकि प्रत्येक 'तारीख' शायद गणित करता है। तो यह दिनांकित विधि की तुलना में थोड़ा धीमा हो सकता है, लेकिन मेरे लिए यह बहुत अधिक स्पष्ट है। खासकर तब जब मैं सिर्फ साल और महीने के हिसाब से समूह बनाना चाहता हूं (दिन को 1 पर सेट करें)।


4

SQL सर्वर 2012 से शुरू, आप यह कर सकते हैं:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')


4

SQL Server 2000 पर

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)


3

आप दिनांक भाग के लिए निम्नलिखित का उपयोग कर सकते हैं और दिनांक प्रारूपित कर सकते हैं:

DATENAME => एक वर्ण स्ट्रिंग देता है जो निर्दिष्ट तिथि के निर्दिष्ट दिनांक का प्रतिनिधित्व करता है

DATEADD => DATEPART()फ़ंक्शन का उपयोग दिनांक / समय के किसी एक भाग को वापस करने के लिए किया जाता है, जैसे कि वर्ष, महीना, दिन, घंटा, मिनट, आदि।

DATEPART => एक पूर्णांक देता है जो निर्दिष्ट तिथि के निर्दिष्ट दिनांक का प्रतिनिधित्व करता है।

CONVERT()=> CONVERT()फ़ंक्शन एक सामान्य फ़ंक्शन है जो एक डेटा प्रकार की अभिव्यक्ति को दूसरे में परिवर्तित करता है। CONVERT()समारोह विभिन्न स्वरूपों में दिनांक / समय डेटा प्रदर्शित करने के लिए इस्तेमाल किया जा सकता है।

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