سؤال

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top