SQL सर्वर फ़ंक्शन न्यूनतम दिनांक (1 जनवरी, 1753) को वापस करने के लिए


91

मैं 1 जनवरी 1753 को डेटाटाइम के लिए न्यूनतम मान वापस करने के लिए SQL सर्वर फ़ंक्शन की तलाश कर रहा हूं। मैं अपनी स्क्रिप्ट में उस दिनांक मान को हार्डकोड नहीं करूंगा।

क्या ऐसा कुछ भी मौजूद है? (तुलना के लिए, सी # में, मैं बस कर सकता था DateTime.MinValue) या मुझे यह खुद लिखना होगा?

मैं Microsoft SQL Server 2008 एक्सप्रेस का उपयोग कर रहा हूं।


2
बस जिज्ञासु: आप स्तंभ के बजाय NULL होने देने के विरोध में उस तिथि का उपयोग करने की योजना क्यों बना रहे हैं?
जो स्टेफनेली

1
आप के CONVERT(smalldatetime, 0)लिए उपयोग कर सकते हैं smalldatetime
गेब

5
CONVERT (स्मालडैटटाइम, 0) या CONVERT (डेटाइम, 0) या कास्ट (0 डेटाइम के रूप में) डेटाइम का न्यूनतम मूल्य नहीं है
Gennady Vanin Геннадий Ванин

2
@ जो: कॉलम NULL मान की अनुमति नहीं देता है, और जब से मैं यह तालिका नहीं बना रहा हूं, मैं इसे बदलना नहीं चाहता।
जेरेमी

जवाबों:


90

आप एक उपयोगकर्ता निर्धारित फ़ंक्शन लिख सकते हैं जो इस तरह से न्यूनतम तिथि मान लौटाता है:

select cast(-53690 as datetime)

फिर अपनी स्क्रिप्ट में उस फ़ंक्शन का उपयोग करें, और यदि आपको कभी भी इसे बदलने की आवश्यकता है, तो ऐसा करने के लिए केवल एक ही जगह है।

यदि आप इसे बेहतर पठनीयता के लिए पसंद करते हैं, तो वैकल्पिक रूप से, आप इस क्वेरी का उपयोग कर सकते हैं:

select cast('1753-1-1' as datetime)

उदाहरण समारोह

create function dbo.DateTimeMinValue()
returns datetime as
begin
    return (select cast(-53690 as datetime))
end

प्रयोग

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000

55
आप एक मनमाना निरंतर है करने के लिए जा रहे हैं, '1753-1-1'बहुत से बेहतर है-53690
Gabe

6
फ़ंक्शन नाम मान का अर्थ स्पष्ट करेगा।
RedFilter

3
SQL दिनांक 2012 में getdate () के समान न्यूनतम दिनांक प्राप्त करने के लिए भी कोई फ़ंक्शन नहीं है, इसलिए उपरोक्त एक ही संभव समाधान है। यह उन लोगों के लिए है जो sql सर्वर 2012 संबंधित समाधान में बेहतर समाधान की तलाश कर रहे हैं।
राम

1
बस DateTime2 (7) का उपयोग करें। यह .NET डेटाइम प्रकार के मानचित्रों के समान है। Sql 'डेटाइम' का उपयोग करना 'ncharchar' के बजाय 'varchar' का उपयोग करने के रूप में बुरा है। 'nvarchar' .NET स्ट्रिंग प्रकार के साथ संरेखित करता है। एक ही विचार। तब आप हर जगह सिर्फ DateTime.MinValue का उपयोग कर सकते हैं।
त्रिनको 21

2
जैसा कि नीचे फ्रैंक गिलिच ने कहा है, cast('17530101' as datetime)क्षेत्रीय मुद्दों से भी बचेंगे और -53690 की तुलना में थोड़ा अधिक पठनीय हैं।
जिम

29

क्या आपने SqlDateTime वस्तु देखी है ? SqlDateTime.MinValueअपनी न्यूनतम तिथि (जनवरी १ (५३) प्राप्त करने के लिए उपयोग करें।


32
यह एक SQL फ़ंक्शन होना चाहिए, .NET फ़ंक्शन नहीं।
जेरेमी

5
हालांकि SqlDateTime.MinValue उपयोगी है, यह एक जवाब के रूप में यह धोखा है। @ जेरेमी एक देशी एसक्यूएल फ़ंक्शन के लिए पूछ रहा है। .NET की क्लास लाइब्रेरी से कुछ नहीं
इवान

6
इसके लिए एक से एक समान प्रश्न के साथ मदद की, लेकिन एक .net संदर्भ में SQL नहीं; जैसा कि इस सवाल के साथ होता है ..
t_plusplus

हो सकता है कि आप
कपे

13

जैसा कि मैं अपर्याप्त जवाब प्रतिष्ठा के कारण स्वीकार किए गए उत्तर पर टिप्पणी नहीं कर सकता क्योंकि मेरी टिप्पणी एक उत्तर के रूप में आती है।

का उपयोग select cast('1753-1-1' as datetime)विफल होने के कारण होता है यदि क्षेत्रीय सेटिंग्स के साथ डेटाबेस पर चलाया जाता है जो YYYY-MM-DD प्रारूप के डेटस्ट्रिंग को स्वीकार नहीं करता है।

इसके बजाय select cast(-53690 as datetime)या Convertनिर्दिष्ट डेटाइम प्रारूप के साथ उपयोग करें ।


6

'yyyymmdd'क्षेत्रीय मुद्दों से बचने के लिए मूल मान के रूप में दिनांक दर्ज करें :

select cast('17530101' as datetime)

हाँ, यह बहुत अच्छा होगा अगर TSQL था MinDate() = '00010101', लेकिन ऐसी कोई किस्मत नहीं।


4

यहां न्यूनतम तिथि मान प्राप्त करने का एक तेज़ और उच्च पठनीय तरीका है

नोट: यह एक नियतात्मक कार्य है , इसलिए प्रदर्शन को और बेहतर बनाने के लिए हम वापसी मूल्य के लिए SCHEMABINDING के साथ भी आवेदन कर सकते हैं।

एक फंक्शन बनाएं

CREATE FUNCTION MinDate()
RETURNS DATETIME WITH SCHEMABINDING
AS
BEGIN
    RETURN CONVERT(DATETIME, -53690)

END

फ़ंक्शन को कॉल करें

dbo.MinDate()

उदाहरण 1

PRINT dbo.MinDate()

उदाहरण 2

PRINT 'The minimimum date allowed in an SQL database is ' + CONVERT(VARCHAR(MAX), dbo.MinDate())

उदाहरण 3

SELECT * FROM Table WHERE DateValue > dbo.MinDate()

उदाहरण 4

SELECT dbo.MinDate() AS MinDate

उदाहरण 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate

3

यह 1 जनवरी, 1753 नहीं है, लेकिन कास्ट ('डेटाइम के रूप में' का चयन करें) जो बताता है: 1900-01-01 00: 00: 00.000 SQL सर्वर द्वारा डिफ़ॉल्ट मान देता है। (वैसे भी मेरे लिए अधिक अनधिकृत लगता है)


1
यह सही नहीं है। आधार डेटाइम 1 जनवरी 1900 00: 00: 00.000 (जो आपको मिलता है SELECT CONVERT(DATETIME, 0)) लेकिन वास्तविक न्यूनतम मूल्य जो कि डेटटाइम SQL सर्वर में पकड़ सकता है वास्तव में 1753 में ओपी ने लिखा है। यही कारण है कि जब अमेरिका ने ग्रेगोरियन कैलेंडर को भी स्विच किया और SQL सर्वर को लापता दिनों आदि से निपटने की ज़रूरत नहीं है, तो एक अतिप्रवाह के बारे में एक त्रुटि SELECT CONVERT(DATETIME, -53690)देता है 1753-01-01 00:00:00.000और SELECT CONVERT(DATETIME, -53691)देता है।
बगयबनी

0

यह वह है जो मैं SQL सर्वर में न्यूनतम दिनांक प्राप्त करने के लिए उपयोग करता हूं। कृपया ध्यान दें कि यह वैश्वीकरण के अनुकूल है:

CREATE FUNCTION [dbo].[DateTimeMinValue]()
RETURNS datetime
AS
BEGIN
  RETURN (SELECT
    CAST('17530101' AS datetime))
END

कॉल का उपयोग करें:

SELECT [dbo].[DateTimeMinValue]()

-1

इसके लिए रेंज datetimeनहीं बदलेगी, क्योंकि इससे बैकवर्ड कम्पेटिबिलिटी टूट जाएगी। तो आप इसे हार्ड कोड कर सकते हैं।


2
यह सच है, लेकिन यह अभी भी अच्छा होगा कि GetMinDate () या कॉनवर्ट (डेटाइम, '1753-1-1') के बजाय ऐसा कुछ भी कहें, जहां मुझे इसका उपयोग करने की आवश्यकता हो।
जेरेमी

@ जेरेमी: मुझे पता है कि क्या convertकरता है, लेकिन इसके लिए GetMinDate()मुझे फंक्शन डेफिनेशन में जाना होगा। इसलिए अगर मुझे आपका कोड बनाए रखना था, तो मैं convertवेरिएंट को पसंद करूंगा ।
एंडोमर

1
आप जानते हैं कि क्या convertकरता है, लेकिन आप जरूरी नहीं जानते होंगे कि इसका महत्व क्या है 1753-1-1
jwg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.