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




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

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

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


بما أن 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