पिछले दिन से सभी पंक्तियों का चयन करने के लिए SQL कथन


120

मैं एक तालिका से पिछले दिन की सभी पंक्तियों का चयन करने के लिए एक अच्छे एसक्यूएल स्टेटमेंट की तलाश कर रहा हूं। तालिका में एक डेटाइम कॉलम होता है। मैं SQL Server 2005 का उपयोग कर रहा हूं।

जवाबों:


212

आज बिना समय गवाएं:

SELECT dateadd(day,datediff(day,0,GETDATE()),0)

कोई समय नहीं:

SELECT dateadd(day,datediff(day,1,GETDATE()),0)

केवल कल से सभी पंक्तियों के लिए क्वेरी:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)

@ashuthinks, आपकी टिप्पणी से मुझे कोई मतलब नहीं है। मूल प्रश्न पूछता है कि पिछले दिन से पंक्तियाँ कैसे प्राप्त करें। ऐसा करने के लिए आपको आज की तारीख (केवल समय) और कल की तारीख (केवल समय नहीं) प्राप्त करने में सक्षम होना चाहिए। आप इन (कालातीत) दिनांक का उपयोग `WHERE` खंड में करते हैं। हालांकि, SELECT *वसीयत किसी भी तारीख को उनके मूल समय के साथ वापस कर देगी।
के.एम.

दिनांकित "गलत पैरामीटर गणना त्रुटि" देता है। और stackoverflow.com/a/18926156/3007408 का कहना है कि datediff केवल 2 मापदंडों का उपयोग कर सकता है। कोई भी समाधान??
Sp0T

@ Sp0T, इस सवाल को SQL सर्वर को टैग किया गया है , जिसमें एक DatedIFF () फ़ंक्शन है जो तीन मापदंडों ( msdn.microsoft.com/en-us/library/ms189794.aspx ) को स्वीकार करता है। आपके द्वारा लिंक किया गया प्रश्न MySql के लिए है, जो मुझे लगता है। अलग-अलग तरह से काम करता है जैसा आपने पाया है। आप पाएंगे कि एसक्यूएल पूरी तरह से विनिमेय नहीं है, विभिन्न विक्रेताओं के बीच इस तरह के कई अंतर हैं, खासकर तारीख से निपटने के बारे में।
के.एम.

ओह धन्यवाद। नहीं पता था कि Btw मैंने "दही के बीच () -1 दिन और दही ()" का उपयोग करके इस मुद्दे को हल किया। यह इस मामले में भी इस्तेमाल किया जा सकता है हो सकता है।
Sp0T

1
@ रसमसबिडस्ट्रप, हाँ। जब मैं दौड़ता SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)हूँ तो मुझे मिलता है:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
के.एम.

44

SQL में "आज" मान प्राप्त करने के लिए:

convert(date, GETDATE())

"कल" पाने के लिए:

DATEADD(day, -1, convert(date, GETDATE()))

"आज माइनस एक्स दिन" प्राप्त करने के लिए: -1 में -X बदलें।

तो सभी कल की पंक्तियों के लिए, आपको मिलता है:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())

"दिनांक" डेटाटाइप SQL Server 2005 में मौजूद नहीं है। जब मैं डेटटाइम का उपयोग करता हूं, तो समय मान रहता है और गणना 0 बजे से 12 बजे तक नहीं होती है, लेकिन उस समय से जब आप क्वेरी चलाते हैं
rudimenter

1
मेरी गलती। मैंने नहीं देखा कि आप SQL Server 2005 के साथ काम कर रहे थे। वास्तव में, मेरा कोड SQL Server 2008 के लिए ही काम करता है।
कोनामिमन

मैंने हमेशा सोचा था कि DATEADD (दिन, ....) एक बेकार था, बस तारीख के खिलाफ दिनों की संख्या जोड़ें या घटाएं: चयन करें () - 1
KM।

18

ऐसा लगता है कि स्पष्ट उत्तर गायब था। तालिका (Ttable) से सभी डेटा प्राप्त करने के लिए जहां स्तंभ (DatetimeColumn) टाइमस्टैम्प के साथ एक डेटाटाइम है, निम्नलिखित क्वेरी का उपयोग किया जा सकता है:

SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday

इसे आसानी से आज, पिछले महीने, पिछले साल, आदि में बदला जा सकता है।


3
यह एक बहुत अच्छी तरह से काम करता है, लेकिन इसकी तुलना में बहुत अधिक महंगा है DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)क्योंकि इसे प्रत्येक पंक्ति पर
DatedIFF


5

इसका वास्तव में एक पुराना धागा है, लेकिन यहाँ मेरा इस पर ध्यान है। 2 अलग-अलग खंडों के बजाय, एक से अधिक और उससे कम। मैं ए डेट से रिकॉर्ड चुनने के लिए इसे नीचे सिंटैक्स का उपयोग करता हूं। यदि आप एक तिथि सीमा चाहते हैं तो पिछले उत्तर जाने का तरीका है।

SELECT * FROM TABLE_NAME WHERE 
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0

उपरोक्त मामले में कल के रिकॉर्ड के लिए X -1 होगा


4

अभी इसका परीक्षण नहीं कर सकते, लेकिन:

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)

3

यह करना चाहिए:

WHERE `date` = CURDATE() - INTERVAL 1 DAY

1
(क्षमा करें) लेकिन आपका जवाब केवल MySQL संगत है, प्रश्न SQL सर्वर के लिए है
StefanJCollier

2

SQL सर्वर में ऐसा करते हैं:

where cast(columnName as date) = cast(getdate() -1 as date)

समय स्वरूपण के साथ समस्याओं से बचने के लिए आपको अभिव्यक्ति के दोनों किनारों को तारीख तक डालना चाहिए।

यदि आपको अधिक विस्तार से अंतराल को नियंत्रित करने की आवश्यकता है, तो आपको कुछ इस तरह की कोशिश करनी चाहिए:

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)

1

इसे "कल" ​​बताने का एक और तरीका ...

Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))

यह अवधारणा 1 जनवरी को, साथ ही साथ हर महीने के पहले दिन अच्छी तरह से काम नहीं करेगी। लेकिन मक्खी पर यह प्रभावी है।


1

खैर, डेटाइम कॉलम को डेट और तुलना की तुलना में आसान बनाना है।

SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) = 
   dateadd(day,0, convert(date, getdate(), 105)) 

0

सबडेट (अब), 1) कल टाइमस्टैम्प लौटेगा। नीचे दिया गया कोड कल के टाइमस्टैम्प के साथ सभी पंक्तियों का चयन करेगा

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.