sql-server - SQL सर्वर डेटटाइम डेटाटाइप से केवल दिनांक को वापस कैसे करें




tsql date datetime (25)

SELECT GETDATE()

रिटर्न: 2008-09-22 15:24:13.790

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

मैं इसे कैसे प्राप्त कर सकता हूं?


Answers

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

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

आपको हमेशा आगे बढ़ना चाहिए और अपनी तिथि टाइम डेटा प्रकार को कॉलिंग प्रोग्राम में और प्रस्तुति स्तर में वापस करना चाहिए , जो भी समायोजन आवश्यक हैं। जैसे ही आप उन्हें कॉलर पर लौटने से पहले चीजों को परिवर्तित करते हैं, आप एप्लिकेशन से संदर्भित अखंडता की सभी आशाओं को हटा रहे हैं। यह एक अद्यतन या डिलीट ऑपरेशन को फिर से रोक देगा, जब तक कि आप कुछ प्रकार के मैन्युअल रिवर्सन नहीं करते हैं, जो कि आवश्यकता होने पर मानव / कोड / gremlin त्रुटि में फिर से अपना डेटा उजागर कर रहा है।


फ्लायर () का उपयोग करना - बस समय काट लें।

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

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

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')

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

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

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

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

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

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

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


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 बारे में सोचने की जरूरत नहीं है

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

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


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

SQL सर्वर 2000 में दिनांक और समय मैनिपुलेशन

कास्ट और कन्वर्ट

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

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

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

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

मैं Holpe यह उपयोगी है।


SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'

यदि आपको वाराटर डेटाटाइप में परिणाम की आवश्यकता है तो आपको जाना चाहिए

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)) केवल दिनांक के रूप में --2014-03-26 00: 00: 00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) डेटाटाइम, कनवर्टर (वचर SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) केवल दिनांक के रूप में --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


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

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

set showplan_text on
GO 

DATEADD और DATEDIFF दोनों एक CONVERT_IMPLICIT निष्पादित करेंगे।

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

डेट्सटेबल से कन्वर्ट (वर्कर, माईडेट, 101) चुनें

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

DATEDD चुनें (डीडी, 0, DATEDIFF (डीडी, 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 के रूप में फ़्लोर () का उपयोग करने के लिए डेटडिफ़ के करीब प्रदर्शन किया गया है, लेकिन डेटाटाइम डेटा प्रकार को फ़्लोट करने के लिए कास्ट करने की सिफारिश नहीं की जाती है और पीछे हमेशा मूल मान नहीं मिलता है।

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

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

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

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


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

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

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

एसक्यूएल सर्वर के लिए पहले से ही कई उत्तर और स्वरूपण प्रकार हैं। लेकिन अधिकांश विधियां कुछ हद तक संदिग्ध हैं और विशिष्ट तिथि प्रारूप के संबंध में प्रारूप प्रकार या कार्यों के लिए संख्याओं को याद रखना आपके लिए मुश्किल होगा। यही कारण है कि 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        2011年10月1日

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

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

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

यदि SQL 2008 और ऊपर का उपयोग करना है:

select cast(getdate() as date)

यह सभी उत्तरों में गायब था, शायद सबसे कुशल नहीं हो सकता है लेकिन लिखना और समझना बहुत आसान है, कोई शैली की आवश्यकता नहीं है, कोई जटिल तारीख कार्य नहीं है।

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

SQL सर्वर 2000 पर

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

तिथि (दिनांक और समय फ़ील्ड) और DATE_FORMAT (दिनांक और समय, '% वाई-% एम-% डी') दोनों तारीख और समय से केवल तारीख लौटाते हैं


तिथि प्रारूप में वापसी के लिए

सीएएसटी (ऑर्डरडेट एएस डेट)

उपरोक्त कोड एसक्यूएल सर्वर 2010 में काम करेगा

यह 12/12/2013 की तरह वापस आ जाएगा

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

CONVERT(VARCHAR(10), OrderDate , 111)

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

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

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

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

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

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


एसक्यूएल सर्वर + परिवर्तन तालिका + कॉलम + डिफ़ॉल्ट मूल्य अद्वितीय पहचानकर्ता जोड़ें ...

ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO




sql sql-server tsql date datetime