sql server شرح أرضية تاريخ في خادم SQL




type data in sql server (8)

في SQL Server ، كيف يمكنني "أرضية" DATETIME إلى الثاني / الدقيقة / ساعة / يوم / سنة؟

لنفترض أن لدي تاريخًا من 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

يمكن لوظيفة CONVERT() القيام بذلك أيضًا ، اعتمادًا على النمط الذي تستخدمه.


بما أن PostgreSQL هو أيضا "خادم SQL" ، سأذكر

date_trunc()

الذي يفعل بالضبط ما كنت أطلب برشاقة.

فمثلا:

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


هناك عدة طرق لبشر هذه القطة =)

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

لقد استخدمت @ Portman الإجابة عدة مرات على مر السنين كمرجع عند تواريخ الأرضيات وانتقلت في عملها إلى وظيفة قد تجدها مفيدة.

أنا لا أدعي أداءه ونقدمه فقط كأداة للمستخدم.

أطلب منكم ، إذا قررت أن تقارن هذه الإجابة ، أن تطلعوا أيضًا على إجابة @ Portman ، حيث أن كوداتي مشتق من إجابته .

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

توسيع في تحويل / Cast الحل ، في Microsoft SQL Server 2008 يمكنك القيام بما يلي:

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

مجرد استبدال getdate() مع أي عمود وهو وقت / وقت.

لا توجد سلاسل مرتبطة بهذا التحويل.

هذا أمر جيد بالنسبة للاستعلامات أو التحديثات المخصصة ، ولكن بالنسبة للارتباطات الرئيسية أو المعالجة المكثفة ، قد يكون من الأفضل التعامل مع التحويل داخل المعالجة أو إعادة تعريف الجداول للحصول على المفاتيح والبيانات المناسبة.

في عام 2005 ، يمكنك استخدام الطابق cast(floor(cast(getdate() as float)) as datetime) : cast(floor(cast(getdate() as float)) as datetime)

لا أعتقد أن استخدام تحويل السلسلة إما ، ولكن لا يمكنني التحدث لمقارنة الكفاءة الفعلية مقابل تقديرات كرسي بذراعين.


المفتاح هو استخدام DATEADD و DATEDIFF جنبا إلى جنب مع التعداد الزمني SQL SQL المناسبة.

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. لذا اختر قيمة معروفة تكون مضمونة لتكون أقل من التاريخ والوقت الذي تحاول فيه.


يمكن أن يساعد DateAdd مع 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


سيئة للغاية ليست Oracle ، أو يمكنك استخدام trunc () أو to_char ().

ولكن كان لدي مشكلات مشابهة مع SQL Server واستخدمت أساليب CONVERT () و DateDiff () ، كما المشار إليه here





tsql