Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

máy chủ sql hiển thị ngày bị thiếu

Tôi khuyên bạn nên sử dụng table valued function để giúp bạn có tất cả các ngày trong khoảng giữa 2 ngày đã chọn dưới dạng bảng (Hãy dùng thử trong fiddle này) :

CREATE FUNCTION dbo.GetAllDaysInBetween(@FirstDay DATETIME, @LastDay DATETIME)
RETURNS @retDays TABLE 
(
    DayInBetween DATETIME
)
AS 
BEGIN
    DECLARE @currentDay DATETIME
    SELECT @currentDay = @FirstDay

    WHILE @currentDay <= @LastDay
    BEGIN

        INSERT @retDays (DayInBetween)
            SELECT @currentDay

        SELECT @currentDay = DATEADD(DAY, 1, @currentDay)
    END 

    RETURN
END

(Tôi đưa vào một thiết lập bảng đơn giản để dễ dàng kiểm tra copypaste)

CREATE TABLE SiteVisit (ID INT PRIMARY KEY IDENTITY(1,1), visitDate DATETIME, visitSite NVARCHAR(512))

INSERT INTO SiteVisit (visitDate, visitSite)
    SELECT '2014-03-11', 'site1'
    UNION
    SELECT '2014-03-12', 'site1'
    UNION
    SELECT '2014-03-15', 'site1'
    UNION
    SELECT '2014-03-18', 'site1'
    UNION
    SELECT '2014-03-18', 'site2'

bây giờ bạn có thể chỉ cần kiểm tra những ngày không có lượt truy cập nào xảy ra khi bạn biết "các ngày ranh giới", chẳng hạn như sau:

SELECT
        DayInBetween AS missingDate,
        'site1' AS visitSite
    FROM dbo.GetAllDaysInBetween('2014-03-11', '2014-03-18') AS AllDaysInBetween
    WHERE NOT EXISTS 
        (SELECT ID FROM SiteVisit WHERE visitDate = AllDaysInBetween.DayInBetween AND visitSite = 'site1')

Hoặc nếu bạn muốn biết tất cả các ngày mà bất kỳ trang web nào không được truy cập, bạn có thể sử dụng truy vấn này:

SELECT
        DayInBetween AS missingDate,
        Sites.visitSite
    FROM dbo.GetAllDaysInBetween('2014-03-11', '2014-03-18') AS AllDaysInBetween
    CROSS JOIN (SELECT DISTINCT visitSite FROM SiteVisit) AS Sites
    WHERE NOT EXISTS
        (SELECT ID FROM SiteVisit WHERE visitDate = AllDaysInBetween.DayInBetween AND visitSite = Sites.visitSite)
    ORDER BY visitSite

Chỉ cần lưu ý nhỏ:có vẻ như bạn có một số trùng lặp trong bảng của mình (không được chuẩn hóa) siteName thực sự nên đi vào một bảng riêng biệt và chỉ được tham chiếu từ SiteVisit



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giải thích về ANSI_NULLS của Máy chủ SQL

  2. Không thể sử dụng hiệu chính đặc biệt 'sa'

  3. Tổng cộng dồn trong máy chủ MS Sql

  4. Làm cách nào để liên kết tham số ISO8601 TSQL DATETIME với PDO?

  5. Có kiểu dữ liệu Boolean trong Microsoft SQL Server giống như trong MySQL không?