आधी रात को एसक्यूएल डेटाइम को गोल करना


81

मुझे अपनी SQL क्वेरी के साथ एक छोटी सी समस्या हो रही है। मैं GETDATE फ़ंक्शन का उपयोग कर रहा हूं, हालांकि, मान लें कि मैं स्क्रिप्ट को 5PM पर निष्पादित करता हूं, यह 12/12/2011 5PM से 12/18/2011 5PM के बीच के रिकॉर्ड को खींच देगा। मैं इसे पूरे 12/12/2011 - 12/18/2011 को मूल रूप से समय की अनदेखी करने के लिए रिकॉर्ड कैसे बना सकता हूं।

मेरी स्क्रिप्ट:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate > (GETDATE()-6)  

जवाबों:


114

SQL Server 2008 और नए में आप कर सकते हैं DateTimeएक Date, जो समय तत्व निकालता है।

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= (cast(GETDATE()-6 as date))  

SQL सर्वर 2005 और नीचे में आप उपयोग कर सकते हैं:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= DateAdd(Day, Datediff(Day,0, GetDate() -6), 0)

1
मुझे यह मिल गया है कि इस प्रकार की तारीख परिभाषित प्रणाली प्रकार नहीं है।
मेंहदीरोन

2
मुझे लगता है कि आप SQL 2008 का उपयोग नहीं कर रहे हैं :)
डेवशॉ

@ user1090389 यही कारण है कि मैंने स्ट्रिंग रूपांतरण का विकल्प रखा, डी
बस्सम मेहन्नी

@DaveShaw - वहाँ एक DATEADD गुम
MatBailie

क्षमा करें @ डेम कम जटिल लग रहा है
हेनरीकरन

54

यहाँ मैं पाया गया सबसे सरल बात है

-- Midnight floor of current date

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))

DatedIFF 1900-1-1 से पहले या बाद के दिनों की पूर्णांक संख्या लौटाता है, और कनवर्ट किए गए डेटाटाइम को आधी रात को उस तारीख पर वापस लाता है।

चूंकि डेटडिफ़ एक पूर्णांक देता है, आप सही ऑफ़सेट प्राप्त करने के लिए दिनों को जोड़ या घटा सकते हैं।

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)

यह चक्कर नहीं है यह छोटा है ... लेकिन मुझे लगता है कि यही पूछा जा रहा है। (राउंड ऐड टू एंड ट्रंकेट ... और वह राउंडिंग भी नहीं है, कि सीलिंग, लेकिन फिर से सबसे अधिक संभावना है कि आप क्या चाहते हैं। वास्तव में राउंड ऐड .5 (क्या वह काम करता है?) और ट्रंकेट।

यह पता चला है कि आप GetDate () में 5 जोड़ सकते हैं और यह उम्मीद के मुताबिक काम करता है।

-- Round Current time to midnight today or midnight tomorrow

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))

मैंने SQL सर्वर 2008 पर अपने सभी परीक्षण किए, लेकिन मुझे लगता है कि ये फ़ंक्शन 2005 के लिए भी लागू होते हैं।


2k5 में यह काम करता है बस यह परीक्षण किया। where [ScanDate] >= convert(datetime, datediff(day, 0, getdate())) and [ScanDate] < convert(datetime, datediff(day, -1, getdate()))
nulltron

9
--
-- SQL DATEDIFF getting midnight time parts 
--
SELECT GETDATE() AS Now, 
   Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) AS MidnightToday,
   Convert(DateTime, DATEDIFF(DAY, -1, GETDATE())) AS MidnightNextDay,
   Convert(DateTime, DATEDIFF(DAY, 1, GETDATE())) AS MidnightYesterDay
go
Now                   MidnightToday          MidnightNextDay        MidnightYesterDay     
 --------------------  ---------------------  ---------------------  --------------------- 
 8/27/2014 4:30:22 PM  8/27/2014 12:00:00 AM  8/28/2014 12:00:00 AM  8/26/2014 12:00:00 AM 

5
SELECT getdate()

परिणाम: 2012-12-14 16: 03: 33.360

SELECT convert(datetime,convert(bigint, getdate()))

परिणाम 2012-12-15 00: 00: 00.000


1
प्रतिक्रिया के लिए धन्यवाद। जो मैं यह बताने की कोशिश कर रहा था कि बिगिन और बैक में कनवर्ट करना आपके लिए गोलाई है।
जेरेमी एटकिंसन

1
यह कोड दिन के अंत में आधी रात तक इसे राउंड करता है यदि समय दोपहर के बाद का है जो आधे दिन के लिए गलत है।
क्रिस जैल

इस विधि का उपयोग बड़े डेटासेट के साथ बाद में प्रदर्शन प्रभाव पैदा कर सकता है।
टैको

3

जैसा कि @BassamMehanni ने उल्लेख किया है, आप SQL Server 2008 में DATE तक कास्ट कर सकते हैं ...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= CAST(GetDate() - 6 AS DATE)
  AND dateField <  CAST(GetDate() + 1 AS DATE)

दूसरी स्थिति वास्तव में बस हो सकती है GetDate(), लेकिन मैं इस प्रारूप को Less Than DateXडेट के लिए डेटफिल्ड से बचने के लिए एक उदाहरण के रूप में दिखा रहा हूं और साथ ही, इस प्रकार बड़े पैमाने पर प्रदर्शन में सुधार कर रहा हूं ।


यदि आप 2005 या उससे कम उम्र के हैं, तो आप इसका उपयोग कर सकते हैं ...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0)
  AND dateField <  DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)

3

यह प्रयोग करके देखें।

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())

1

यह सस्ता लग सकता है लेकिन यह मेरे लिए काम कर रहा है

सेनेट कंवर्ट (डैटटाइम, लेफ्ट (कॉन्करेट, @ डेटफ्रीऑर्विएबल, 101), 10) + '00: 00: 00.000')


1

आप डेटटाइम को डेट में परिवर्तित कर सकते हैं और फिर डेटटाइम में वापस ला सकते हैं। यह टाइमस्टैम्प को रीसेट कर देगा।

चुनिंदा गेटडेट () - 2020-05-05 13: 53: 35.863

कास्ट (कास्ट (GETDATE)) को डेटटाइम के रूप में चुनें) - 2020-05-05 00: 00: 00.000

0

मैं आमतौर पर करता हूं

SELECT *
FROM MyTable
WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)

यदि आप SQL SERVER 2008 का उपयोग कर रहे हैं, तो आप कर सकते हैं

SELECT *
FROM MyTable
WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)

उम्मीद है की यह मदद करेगा


3
यदि आप अनुक्रमणिका आदि का उपयोग करने के लिए ऑप्टिमाइज़र की क्षमता को नष्ट करने वाले पहले उदाहरण का उपयोग करते हैं, तो तारीख अंकगणितीय और तुलना करने के लिए स्ट्रिंग फ़ंक्शन का उपयोग करना बहुत बुरा विचार है। यह कभी भी (imo) उल्लेख नहीं किया जाना चाहिए, यह है कि गरीब एक विकल्प है।
MatBailie

यदि आप SQL Server 2008 का उपयोग कर रहे हैं, तो आपको इसकी आवश्यकता नहीं है, अन्यथा, मुझे यकीन नहीं है कि आप इसे SQL Server 2000/2005 में कैसे कर सकते हैं, एक उदाहरण की सराहना की जाएगी, धन्यवाद।
बासम मेहन्नी

निष्पक्ष तौर पर। दोनों विकल्प अनुक्रमणिका का उपयोग करने के लिए ऑप्टिमाइज़र की क्षमता को नष्ट कर देते हैं। आपको फ़िल्टर को स्तंभ पर समर्पित करना चाहिए और कार्य करना चाहिए। इसमें जातियां भी शामिल हैं।
पीआईएम

0

आप समय कम कर सकते हैं।

ROUNDनीचे का उपयोग करके इसे मध्यरात्रि तक पूरा किया जाएगा।

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >  CONVERT(datetime, (ROUND(convert(float, getdate()-6.5),0)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.