كيفية الحصول على جدول مواعيد بين x و y في sql server 2005
-
01-07-2019 - |
سؤال
أريد فقط طريقة سريعة (و يفضل عدم استخدام حلقة while)من createing جدول كل موعد بين التاريخ @x والتاريخ @y حتى أستطيع ترك الخارجي الانضمام إلى بعض الإحصائيات والجداول التي لن يكون لها أي سجلات أيام معينة في بين, السماح لي علامة في عداد المفقودين أيام 0
المحلول
بالمعنى الدقيق للكلمة هذا ليس الجواب على سؤالك ولكن أنيق جدا.
على افتراض انك يمكن أن يعيش مع تحديد عدد الأيام بعد تاريخ البدء ، ثم باستخدام الجدول المشترك التعبير يعطيك:
WITH numbers ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM numbers WHERE n < 500 )
SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers
OPTION ( MAXRECURSION 500 )
نصائح أخرى
أعتقد أنك تبحث عن هذا بلوق وظيفة.
وأود أن إنشاء تقويم الجدول التي تحتوي على كل تاريخ من مناسبة بدء التاريخ حتى نهاية مناسبة الآن.هذا لن يستغرق الكثير من الفضاء في قاعدة البيانات الخاصة بك وسوف تجعل هذه الأنواع من الاستعلام لعب الأطفال.
select ...
from Calendar
left outer join
...
where Calendar.Date >= @x
and Calendar.Date <= @y
أعتقد أن عليك أن تفعل ذلك في حين حلقة.أنا أعرف انها قبيحة, ولكن من السهل وأنه يعمل.
كنت تفعل شيئا في الواقع مشابهة قليلا إلى الوراء ، ولكن لم أستطع الخروج مع الطريقة التي لم تستخدم حلقة.
أفضل ما لدي كان temp الجدول ، ثم تحديد مواعيد أردت أن أشارك في ذلك.
بلوق bduke مرتبطة هو لطيف ، على الرغم من أنني أعتقد temp طاولة الحل هو ربما نظافة الحل.
لقد وجدت آخر جدول يقوم بتخزين كل تاريخ (إنه زوار الموقع), فكيف هذا...
Declare @FromDate datetime,
@ToDate datetime
Declare @tmpDates table
(StatsDate datetime)
Set @FromDate = DateAdd(day,-30,GetDate())
Set @ToDate = GetDate()
Insert Into @tmpDates (StatsDate)
Select
distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
FROM tbl_visitorstats
Where visitDate between @FromDate And @ToDate
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
Select * FROM @tmpDates
لا تعتمد على طاولة أخرى بعد إدخال كل موعد أريد, لكنه 98% الأرجح سيكون هناك البيانات كل يوم.
تطور طفيف على الجواب كما https://stackoverflow.com/a/95728/395440.يسمح يوما أن تكون محددة و أيضا بحساب تتراوح ما يصل إلى التاريخ الحالي.
DECLARE @startDate datetime
SET @startDate = '2015/5/29';
WITH number ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE()) )
SELECT DATEADD(day,n-1,@startDate) FROM number where
datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
OPTION ( MAXRECURSION 500 )
مجرد كتابة حلقة.شخص ما يجب أن أكتب حلقة هذا, إنها لك - أو SQL Server.
DECLARE @Dates TABLE
(
TheDate datetime PRIMARY KEY
)
DECLARE @StartDate datetime, @EndDate datetime
SELECT @StartDate = '2000-01-01', @EndDate = '2010-01-01'
DECLARE @LoopVar int, @LoopEnd int
SELECT @LoopEnd = DateDiff(dd, @StartDate, @EndDate), @LoopVar = 0
WHILE @LoopVar <= @LoopEnd
BEGIN
INSERT INTO @Dates (TheDate)
SELECT DateAdd(dd,@LoopVar,@StartDate)
SET @LoopVar = @LoopVar + 1
END
SELECT *
FROM @Dates
فقط:حيث col > بدء تاريخ col < نهاية التاريخ