मैं SQL में एक महीने के पहले दिन का चयन कैसे कर सकता हूं?


308

मुझे केवल दिए गए डेटाइम चर के महीने के पहले दिन का चयन करने की आवश्यकता है।

मुझे पता है कि इस तरह के कोड का उपयोग करना काफी आसान है:

select CAST(CAST(YEAR(@mydate) AS VARCHAR(4)) 
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)

लेकिन यह बहुत सुरुचिपूर्ण नहीं है, और शायद बहुत तेज भी नहीं है।

क्या ऐसा करने के लिए इससे अच्छा तरीका है? मैं SQL Server 2008 का उपयोग कर रहा हूं।

जवाबों:


603
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth


63
यह ध्यान दिया जाना चाहिए कि मार्टिन स्मिथ द्वारा उल्लिखित बग केवल प्रदर्शन को प्रभावित कर सकता है, शुद्धता नहीं।
ओल्सन.देव


34
अगर कोई सोच रहा है कि SELECT EOMONTH(@mydate) AS EndOfMonthआप महीने का आखिरी दिन देंगे।
१३

3
मैं यह कैसे निर्धारित कर सकता हूं कि यदि प्रसिद्ध कार्डिनैलिटी आकलन बग मुझे प्रभावित करेगा? इसे 2010 में तय किया गया था। क्या इसका मतलब है कि केवल SQL सर्वर 2012 और नए सुरक्षित हैं, या क्या यह संभव है कि 2008 सर्वर को पैच किया गया हो?
जॉन

134

उपरोक्त सभी उत्तर के अलावा, एक तरह से पेश किए गए फ़ंक्शन पर आधारित एक तरीका है sql 2012

SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)

62

SQL सर्वर 2012 के साथ शुरू:

SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))

11
यह केवल 2012 और बाद में काम करने के लिए प्रतीत होता है। msdn.microsoft.com/en-us/library/hh213020.aspx
Josh Yeager

1
क्या इसका फायदा यह है कि यह केवल एक बार स्रोत तिथि का उल्लेख करता है, इसलिए यदि किसी फ़ंक्शन कॉल से व्युत्पन्न हो तो इसे बंद कर दें।
इयान हॉरविल

14

एक स्ट्रिंग की कास्टिंग (यानी "5/1/2009") डेटाइम के लिए निश्चित रूप से अधिक सुपाठ्य है, लेकिन हमने कुछ समय पहले कोड पाया था जो महीने का पहला हिस्सा होगा ...

DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)


6

यह शायद काफी तेज है। इसे एक sql फ़ंक्शन के रूप में क्यों नहीं बनाया गया।

CREATE FUNCTION [dbo].[GetFirstDayOfMonth] ( @InputDate    DATETIME )
RETURNS DATETIME
BEGIN

    RETURN CAST(CAST(YEAR(@InputDate) AS VARCHAR(4)) + '/' + 
                CAST(MONTH(@InputDate) AS VARCHAR(2)) + '/01' AS DATETIME)

END
GO


3

कृपया इसका उपयोग करें

  1. सर्वर 2012 के लिए

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
  2. सर्वर 2012 से पहले

    select  cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)


2
SELECT @myDate - DAY(@myDate) + 1

वास्तव में सरल और सुरुचिपूर्ण समाधान लेकिन ध्यान रखें कि यह चर में निर्दिष्ट होने पर दिनांक का समय भाग भी लौटाता है।
कुकली

मुझे यह काम नहीं मिला। अतिरिक्त समापन ब्रैकेट के अलावा, मुझे यह त्रुटि मिलती है Operand type clash: date is incompatible with int:। मुझे लगता है कि ऐसा इसलिए है क्योंकि आप -ऑपरेटर को डेट पर इस्तेमाल करने की कोशिश कर रहे हैं ?
सैम

मुझे नहीं पता कि प्रदर्शन के मामले में यह कितना अच्छा है, लेकिन यह निश्चित रूप से काम करता है।
salcoin

@Sam, आपको क्लैश मिला है क्योंकि साधारण अंकगणित (+, -) डेटाइम पर काम करता है, तारीखों पर नहीं।
दार्लोव

2
----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
----Last Day of Current Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
----Last Day of Next Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
LastDay_NextMonth

लेकिन ओपी महीने के पहले दिन की तलाश में है। अंतिम दिन के लिए, आप सिर्फ EOMONTH () का उपयोग कर सकते हैं - 2012 से यह तरीका है।
deutschZuid

2

यह एक नया कार्य हो सकता है, लेकिन आप पुराने कार्यों का भी उपयोग कर सकते हैं:

select DATEFROMPARTS(year(@mydate),month(@mydate),'01')

यदि चर में तारीख उदाहरण के लिए थी तो '2017-10-29' यह एक तारीख को वापस आ जाएगी'2017-10-01'

https://docs.microsoft.com/en-us/sql/t-sql/functions/datefromparts-transact-sql?view=sql-server-ver15


1

भविष्य के googler, MySQL पर, यह आज़माएँ:

select date_sub(ref_date, interval day(ref_date)-1 day) as day1;

3
यह एक sql-serverसवाल है, date_subऔर intervalहैं mysql
ओगाज़ा

अच्छा, बिंदु, मैंने प्रतिक्रिया को संपादित किया। मुझे लगता है कि यह अभी भी धागे के लिए प्रासंगिक है।
एरियल टी

1

मैंने एक तिथि के रूप में GETDATE () का उपयोग किया, आप इसे उस तिथि से बदल सकते हैं, जिसकी आपको आवश्यकता है।
यहां बताया गया है कि यह कैसे काम करता है: पहले हम YYYYMMDD में तारीख को प्रारूपित करते हैं ... केवल YYYYMM भाग को रखने के लिए केवल 6 सबसे बाईं ओर के अक्षरों को रखने के लिए प्रारूपण करते हैं, और फिर '01' को महीने के रूप में जोड़ते हैं - और वॉइला! आपके पास चालू माह का पहला दिन है।

SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth

BTW, प्रदर्शन इस पर बहुत अच्छा है!


1

यदि आप इसे आज देख रहे हैं, और SQL सर्वर 2012 या नए का उपयोग करके आपके पास EOMONTH फ़ंक्शन है जो चीजों को आसान बनाता है:

SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth

आप जिस भी चर को चाहते हैं, उसके साथ आप GETDATE () को बदल सकते हैं।


1

यहां हम नीचे क्वेरी का उपयोग महीने की पहली तारीख और महीने की आखिरी तारीख से कर सकते हैं।

SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'

1

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

SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))

1
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))

-2 आपको पिछले महीने का पहला दिन मिलेगा। यानी, गेटडेट () 10/15/18 है। आपके परिणाम 9/1/18 होंगे। -1 में बदलें और आपके परिणाम 10/1/18 होंगे। 0 अगले महीने की शुरुआत होगी, 11/1/2018 .. आदि आदि।

या

DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))

1

निम्न क्वेरी निष्पादित करने का प्रयास करें:

SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)


0

CONVERT (तिथि, DATEADD (dd, - DATEPART (dd, getdate)) - 1), getdate ()), 120 का चयन करें

यह फ़ंक्शन आपको महीने की शुरुआत की तारीख का हिस्सा प्रदान करेगा


0
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())

.................................................. ...................

यदि आप समय नहीं चाहते हैं, तो इसे DATE में रूपांतरित करें या यदि आप 0:00:00 बजे तक करना चाहते हैं, तो DATE में कनवर्ट करें और फिर DATETIME पर वापस जाएं।

SELECT CONVERT (DATETIME,  
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))

अपनी इच्छित तिथि पर GETDATE () बदलें


0

मैंने व्यक्तिगत रूप से सिफारिश की कि नीचे दिए गए एसक्यूएल क्योंकि जब मैं कंडीशन क्लॉज में डेट फंक्शन का उपयोग करने की कोशिश करता हूं, तो यह मेरी क्वेरी की गति को बहुत धीमा कर देता है।

वैसे भी यह कोशिश करने के लिए स्वतंत्र महसूस हो रहा है।

select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')

0

यहां किसी भी महान दिमाग के साथ प्रतिस्पर्धा करने के लिए नहीं, लेकिन एक सरल सुझाव थोड़ा अलग है जो ऊपर दिए गए उत्तर को स्वीकार करता है।

select dateadd(day, -(datepart(day,@date)+1,@date)

0

मुझे उपयोग करना पसंद है FORMAT, आप एक समय भी निर्दिष्ट कर सकते हैं

SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month

0

Sql सर्वर 2012 में,

 select getdate()-DATEPART(day, getdate())+1

 select DATEADD(Month,1,getdate())-DATEPART(day, getdate())

0

इस क्वेरी को MySQL पर बहुत अच्छी तरह से काम करना चाहिए:

SELECT concat(left(curdate(),7),'-01') 

0

किसी के लिए अभी भी उत्तर की तलाश में, यह एक आकर्षण की तरह काम करता है और किसी भी डेटाटेड के साथ दूर करता है। टाइमस्टैम्प वैकल्पिक है, यदि इसे निर्दिष्ट करने की आवश्यकता है, लेकिन साथ ही साथ काम भी नहीं करता है।

SELECT left(convert(varchar, getdate(),23),7)+'-01 00:00:00'

0

SQL में पैरामीटर के रूप में हमारे द्वारा पास की जाने वाली तारीख में पहली तारीख और अंतिम तिथि प्राप्त करें

     @date DATETIME
    SELECT @date = GETDATE()
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date)-1),@date),105) AS value,
    'First Day of Current Month' AS name
    UNION
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@date))),
    DATEADD(mm,1,@date)),105),
    'Last Day of Current Month'
    GO


      **OutPut**

12/01/2019  First Day of Current Month
12/31/2019  Last Day of Current Month

-3

यहाँ आप इसे MySQL में कैसे करेंगे:

  select DATE_FORMAT(NOW(), '%Y-%m-1')

4
कृपया निर्दिष्ट करें कि यह sql-server उत्तर नहीं है, लेकिन केवल MySQL पर काम करता है।
कुकलि

SQL सर्वर के लिए, आप उपयोग कर सकते हैंSELECT FORMAT(GETDATE(), 'yyyy-MM-01')
NASSER

लोगों को केवल कुछ ऐसा करने के लिए तार में तारीखों को प्रारूपित करने के लिए प्रोत्साहित न करें जो संख्यात्मक रूप से किया जा सकता है। यह कहने जैसा है कि "आप इसे एक स्ट्रिंग में प्रारूपित करके निकटतम 100 में एक नंबर को राउंड कर सकते हैं, सभी को प्रतिस्थापित कर सकते हैं, लेकिन अंतिम दो अंक इसे बंद कर देंगे, और एक '00' पर
सहमति व्यक्त करेंगे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.