sql-server - شرح - type data in sql server




أرضية تاريخ في خادم SQL (6)

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

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

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

date_trunc()

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

فمثلا:

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


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

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


في SQL Server هنا خدعة صغيرة للقيام بذلك:

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

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

من المحتمل أن يكون هذا أكثر فعالية من كل DATEADD و DATEDIFF. من المؤكد أنه من الأسهل الكتابة.


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

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

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





tsql