एसक्यूएल सर्वर में डेटटाइम पर दिनांक स्ट्रिंग की तुलना करें?

SQL सर्वर में मेरे पास एक DATETIME कॉलम है जिसमें एक समय तत्व शामिल है।

उदाहरण:

'14 AUG 2008 14:23:019'

समय भाग को अनदेखा करते हुए, किसी विशेष दिन के रिकॉर्ड केवल चुनने के लिए सर्वोत्तम विधि क्या है?

उदाहरण: (सुरक्षित नहीं है, क्योंकि यह समय के भाग से मेल नहीं खाता है और कोई पंक्ति नहीं देता है)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

ध्यान दें: यह साइट आपके द्वारा उठाए गए नोट्स और तकनीकों को कम करने के बारे में भी है और फिर भूल जाओ, मैं इस प्रश्न का अपना उत्तर पोस्ट करने जा रहा हूं क्योंकि एमएसएसक्यूएल में डेटाटाइम सामान शायद एसक्यूएलबीओएल में सबसे ज्यादा दिखने वाला विषय है।


Update Clarified example to be more specific.


Edit Sorry, But I've had to down-mod WRONG answers (answers that return wrong results).

@Jorrit: WHERE (date>'20080813' AND date<'20080815') will return the 13th and the 14th.

@wearejimbo: बंद करें, लेकिन कोई सिगार नहीं है! बैज आपको दिया गया है। आपने 14/08/2008 को लिखे गए रिकॉर्डों को याद किया 23: 59: 001 से 23: 59: 999 (यानी मध्यरात्रि से पहले 1 सेकंड से कम।)

0
ro fr bn

18 उत्तर

SQL सर्वर 2008 में, आप नई DATE डेटाटाइप का उपयोग कर सकते हैं

DECLARE @pDate DATE='2008-08-14'  

SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate  

@Guy। मुझे लगता है कि आप पाएंगे कि यह समाधान ठीक है। अपने मूल के क्वेरी निष्पादन योजना पर एक नज़र डालें क्वेरी।

और मेरा के लिए:

0
जोड़ा

बस वर्ष, महीने और दिन मूल्यों की तुलना करें।

Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'

SELECT * 
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
      AND Month(column_datetime) = Month(@DateToSearch)
      AND Day(column_datetime) = Day(@DateToSearch)
0
जोड़ा

मुझे पता है कि यह बिल्कुल ठीक नहीं है कि आप यह कैसे करना चाहते हैं, लेकिन यह एक शुरुआत हो सकती है:

SELECT *
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
      DATEPART(mm, column_dateTime) as Month, 
      DATEPART(dd, column_dateTime) as Day 
      FROM table1)
WHERE Year = '2008'
AND Month = '8'
AND Day = '14'
0
जोड़ा

यह फ़ंक्शन कास्ट (फ़्लोर (कास्ट (GetDate() फ्लोट के रूप में)) डेटटाइम के रूप में) समय के साथ हटाए गए डेटाटाइप को वापस कर देता है और इसका उपयोग किया जा सकता है।

Select
*
Table1
Where
Cast(Floया(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'

या

DECLARE  @p_date DATETIME
SET      @p_date = Cast('14 AUG 2008' as DateTime)

SELECT   *
FROM     table1
WHERE    Cast(Floया(Cast(column_datetime As Float)) As DateTime) = @p_date
0
जोड़ा
क्या फ़ील्ड पर लागू कई फ़ंक्शन नहीं होंगे (अगर अनुक्रमित) इसे पूर्ण तालिका स्कैन में परिवर्तित करें?
जोड़ा लेखक Manuel Ferreria, स्रोत
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

यह डेटाटाइम और स्ट्रिंग को "YYYY-MM-DD" प्रारूप के वर्चर्स में परिवर्तित करेगा।

यह बहुत बदसूरत है, लेकिन काम करना चाहिए

0
जोड़ा

तकनीक 2:

DECLARE @p_date DATETIME
SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT  *
FROM    table1
WHERE   DATEDIFF( d, column_datetime, @p_date ) = 0

यदि कॉलम_डेटाइम फ़ील्ड अनुक्रमित नहीं है, और यह होने की संभावना नहीं है (या सूचकांक का उपयोग करने की संभावना नहीं है) तो DATEDIFF() का उपयोग करना छोटा है।

0
जोड़ा

एमएस एसक्यूएल सर्वर में DATETIME फ़ील्ड का DATE भाग कैसे प्राप्त करें:

ऐसा करने के सबसे तेज़ और सबसे अच्छे तरीकों में से एक का उपयोग कर रहा है

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

यह सीपीयू बस्टिंग से बचाता है "तिथि को बिना किसी स्ट्रिंग में बदल दें और फिर इसे फिर से परिवर्तित करें" तर्क।

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

महीने के पहले दिन की तारीख प्राप्त करें

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

1 साल पहले दिनांक आरएफओएम प्राप्त करें

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
0
जोड़ा

तकनीक 1:

 DECLARE @p_date DATETIME
 SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

 SELECT  *
 FROM    table1
 WHERE   column_datetime >= @p_date
 AND     column_datetime < DATEADD(d, 1, @p_date)

इसका लाभ यह है कि यह मौजूद होने पर 'कॉलम_डेटाइम' पर किसी भी इंडेक्स का उपयोग करेगा।

0
जोड़ा
मेरा मानना ​​है कि सीएएसटी ('14 AUG 2008 'डेटटाइम के रूप में) थोड़ा बेहतर है। मुझे लगता है कि यह थोड़ा और पठनीय है और मेरा मानना ​​है कि सीएएसटी कन्वर्ट() से अधिक पोर्टेबल है जो उस सीएएसटी() में एएनएसआई एसक्यूएल-9 2 और 99 के साथ संगत है
जोड़ा लेखक Larry OBrien, स्रोत
आप इस उत्तर के लिए कीवर्ड के रूप में BETWEEN कीवर्ड का उपयोग कर सकते हैं।
जोड़ा लेखक Möoz, स्रोत
@ BorhanMooz, वास्तव में, BETWEEN कोड में दिए गए> =/<बीच में कैप्चर नहीं करता है। BETWEEN पूरी तरह से समावेशी है ( technet.microsoft.com/en-us/library/ms187922 .aspx , "परिणाम मान")।
जोड़ा लेखक NargothBond, स्रोत

मैं आमतौर पर डेट-टाइम को आज तक परिवर्तित करता हूं और इनकी तुलना करता हूं:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)

या

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0
0
जोड़ा

आपके द्वारा स्वीकार किए गए उत्तर में इंडेक्स के बारे में अच्छा बिंदु।

फिर भी, यदि आप वास्तव में केवल विशिष्ट <कोड> DATE या DATE श्रेणियां अक्सर पर खोज करते हैं, तो मुझे मिला सबसे अच्छा समाधान एक और निरंतर गणना कॉलम को जोड़ना है आपकी तालिका जिसमें केवल DATE होगा, और इस कॉलम पर अनुक्रमणिका जोड़ें:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED

उस कॉलम पर इंडेक्स जोड़ें:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON  "table1" ( "column_date" ASC )
GO

फिर आपकी खोज तेज होगी:

DECLARE  @p_date DATE
SET      @p_date = CONVERT( DATE, '14 AUG 2008', 106 )

SELECT   *
FROM     table1
WHERE    column_date = @p_date
0
जोड़ा
और फिर, मैं उन तारीखों के लिए आईएसओ प्रारूपों में से एक का उपयोग करने का सुझाव देता हूं जो अधिकांश डेटाबेस पहचानते हैं और भाषा/लोकेल निर्भर नहीं हैं, जैसे YYYY-MM-DD
जोड़ा लेखक van, स्रोत

कुछ इस तरह?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'
0
जोड़ा
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
0
जोड़ा
DECLARE @Dat

SELECT * 
FROM Jai
WHERE                                                                                                          
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                                                              
             CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+              
                     CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat
0
जोड़ा

Sqlserver में

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE [email protected]_date

सी # में ToShortDateString() फ़ंक्शन का उपयोग कर दिनांक मान की छोटी स्ट्रिंग पास करें। नमूना:   DateVariable.ToShortDateString ();

0
जोड़ा

स्ट्रिंग तुलना का उपयोग कर SQL सर्वर में दिनांक की तुलना की जा सकती है: जैसे

DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
0
जोड़ा
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
0
जोड़ा

SQL DATE() फ़ंक्शन का उपयोग करके दिनांक भाग निकालने का सबसे अच्छा तरीका है:

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
0
जोड़ा

There are many formats for date in SQL which are being specified. Refer https://msdn.microsoft.com/en-in/library/ms187928.aspx

चयनित तिथियों के साथ वर्चर कॉलम को कनवर्ट करना और तुलना करना।

वाक्य - विन्यास:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy
0
जोड़ा