sql-server - एसक्यूएल सर्वर में एक तारीख मंजिल करें




tsql (9)

SQL सर्वर में, मैं दूसरे / मिनट / घंटे / दिन / वर्ष में डेटाटाइम को "फ़्लोर" कैसे करूं?

मान लीजिए कि मेरे पास 2008-09-17 12: 56: 53.430 की तारीख है , तो फर्श का आउटपुट होना चाहिए:

  • वर्ष: 2008-01-01 00: 00: 00.000
  • महीना: 2008-09-01 00: 00: 00.000
  • दिवस: 2008-09-17 00: 00: 00.000
  • घंटा: 2008-09-17 12: 00: 00.000
  • मिनट: 2008-09-17 12: 56: 00.000
  • दूसरा: 2008-09-17 12: 56: 53.000

Answers

DateDiff के साथ तिथि जोड़ें कई अलग-अलग कार्यों को करने में मदद कर सकते हैं। उदाहरण के लिए, आप किसी भी महीने के आखिरी दिन को पा सकते हैं साथ ही पिछले या अगले महीने के अंतिम दिन भी पा सकते हैं।

----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

Source


CONVERT() फ़ंक्शन यह भी कर सकता है कि आप किस शैली का उपयोग करते हैं।


चूंकि PostgreSQL भी एक "SQL सर्वर" है, मैं उल्लेख करूंगा

date_trunc()

जो वास्तव में आप पूछ रहे हैं वह करता है।

उदाहरण के लिए:

 select date_trunc('hour',current_timestamp);
       date_trunc
------------------------
 2009-02-18 07:00:00-08
(1 row)


कनवर्ट / कास्ट समाधान पर विस्तार, माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008 में आप निम्न कार्य कर सकते हैं:

cast(cast(getdate() as date) as datetime)

बस किसी भी कॉलम के साथ getdate() को प्रतिस्थापित करें जो एक getdate() है।

इस रूपांतरण में कोई स्ट्रिंग शामिल नहीं है।

विज्ञापन-संबंधी प्रश्नों या अपडेट के लिए यह ठीक है, लेकिन मुख्य जुड़ने या भारी प्रसंस्करण प्रसंस्करण के लिए प्रसंस्करण के भीतर रूपांतरण को संभालना बेहतर हो सकता है या तालिकाओं को उचित कुंजी और डेटा रखने के लिए फिर से परिभाषित किया जा सकता है।

2005 में, आप cast(floor(cast(getdate() as float)) as datetime) फर्श का उपयोग कर सकते हैं: cast(floor(cast(getdate() as float)) as datetime)

मुझे नहीं लगता कि स्ट्रिंग रूपांतरण का उपयोग करता है, लेकिन मैं आर्मचेयर अनुमानों के मुकाबले वास्तविक दक्षता की तुलना करने के लिए बात नहीं कर सकता।


कुंजी एसक्यूएल टाइम्स DATEADD के साथ DATEADD और DATEDIFF का उपयोग DATEADD

declare @datetime datetime;
set @datetime = getdate();
select @datetime;
select dateadd(year,datediff(year,0,@datetime),0);
select dateadd(month,datediff(month,0,@datetime),0);
select dateadd(day,datediff(day,0,@datetime),0);
select dateadd(hour,datediff(hour,0,@datetime),0);
select dateadd(minute,datediff(minute,0,@datetime),0);
select dateadd(second,datediff(second,'2000-01-01',@datetime),'2000-01-01');
select dateadd(week,datediff(week,0,@datetime),-1); --Beginning of week is Sunday
select dateadd(week,datediff(week,0,@datetime),0); --Beginning of week is Monday

ध्यान दें कि जब आप दूसरे द्वारा फर्श कर रहे होते हैं, तो आप 0 का उपयोग करते समय अक्सर अंकगणित ओवरफ्लो प्राप्त करेंगे। इसलिए एक ज्ञात मान चुनें जो उस समय से कम होने की गारंटी है जिसे आप फर्श का प्रयास कर रहे हैं।


इस बिल्ली को त्वचा के कई तरीके हैं =)

select convert(datetime,convert(varchar,CURRENT_TIMESTAMP,101))

SQL सर्वर में ऐसा करने के लिए यहां एक छोटी सी चाल है:

SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)

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

यह सभी DATEADD और DATEDIFF सामानों की तुलना में शायद अधिक कुशल है। यह निश्चित रूप से टाइप करना आसान तरीका है।


मैंने पिछले कुछ वर्षों में @ पोर्टमैन के जवाब का उपयोग संदर्भ के रूप में कई बार किया है जब फर्श की तारीखें हैं और यह एक ऐसे फ़ंक्शन में काम कर रहा है जिसे आप उपयोगी पा सकते हैं।

मैं इसके प्रदर्शन के लिए कोई दावा नहीं करता हूं और इसे केवल उपयोगकर्ता के लिए एक उपकरण के रूप में प्रदान करता हूं।

मैं उससे पूछता हूं, अगर आप इस उत्तर को ऊपर उठाने का फैसला करते हैं, तो कृपया @ पोर्टमैन के उत्तर को भी ऊपर उठाएं, क्योंकि मेरा कोड उसका व्युत्पन्न है।

IF OBJECT_ID('fn_FloorDate') IS NOT NULL DROP FUNCTION fn_FloorDate
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_FloorDate] (
  @Date DATETIME = NULL,
  @DatePart VARCHAR(6) = 'day'
)
RETURNS DATETIME
AS
BEGIN
  IF (@Date IS NULL)
    SET @Date = GETDATE();

  RETURN
  CASE
    WHEN LOWER(@DatePart) = 'year' THEN DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'month' THEN DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'day' THEN DATEADD(DAY, DATEDIFF(DAY, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'hour' THEN DATEADD(HOUR, DATEDIFF(HOUR, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'minute' THEN DATEADD(MINUTE, DATEDIFF(MINUTE, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'second' THEN DATEADD(SECOND, DATEDIFF(SECOND, '2000-01-01', @Date), '2000-01-01')
    ELSE DATEADD(DAY, DATEDIFF(DAY, 0, @Date), 0)
  END;
END

उपयोग:

DECLARE @date DATETIME;
SET @date = '2008-09-17 12:56:53.430';

SELECT
  @date AS [Now],--2008-09-17 12:56:53.430
  dbo.fn_FloorDate(@date, 'year') AS [Year],--2008-01-01 00:00:00.000
  dbo.fn_FloorDate(default, default) AS [NoParams],--2013-11-05 00:00:00.000
  dbo.fn_FloorDate(@date, default) AS [ShouldBeDay],--2008-09-17 00:00:00.000
  dbo.fn_FloorDate(@date, 'month') AS [Month],--2008-09-01 00:00:00.000
  dbo.fn_FloorDate(@date, 'day') AS [Day],--2008-09-17 00:00:00.000
  dbo.fn_FloorDate(@date, 'hour') AS [Hour],--2008-09-17 12:00:00.000
  dbo.fn_FloorDate(@date, 'minute') AS [Minute],--2008-09-17 12:56:00.000
  dbo.fn_FloorDate(@date, 'second') AS [Second];--2008-09-17 12:56:53.000

मुझे निम्नलिखित क्रम में शामिल होने के बारे में सोचना आसान लगता है:

  • क्रॉस जॉइन - दोनों टेबलों का एक कार्टेशियन उत्पाद। सभी शामिल हो जाते हैं
  • अंदरूनी जॉइन - एक फ़िल्टर के साथ एक क्रॉस जॉइन जोड़ा गया।
  • बाहरी जॉइन - गायब तत्वों (या तो बाएं या दाएं तालिका से) के साथ एक इंटर्न जॉइन बाद में जोड़ा गया।

जब तक मैंने यह (अपेक्षाकृत) सरल मॉडल नहीं निकाला, जॉन्स हमेशा एक काला कला का थोड़ा और अधिक था। अब वे सही समझ में आते हैं।

उम्मीद है कि इससे भ्रमित होने से ज्यादा मदद मिलती है।





sql-server tsql