Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

sql server menampilkan tanggal yang hilang

Saya akan merekomendasikan Anda menggunakan table valued function untuk memberi Anda semua hari di antara 2 tanggal yang dipilih sebagai tabel (Cobalah di biola ini) :

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

(Saya menyertakan pengaturan tabel sederhana untuk pengujian copypaste yang mudah)

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'

sekarang Anda dapat dengan mudah memeriksa hari apa tidak ada kunjungan yang terjadi ketika Anda mengetahui "hari batas" seperti ini:

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')

Atau jika Anda ingin mengetahui semua hari di mana situs mana pun tidak dikunjungi, Anda dapat menggunakan kueri ini:

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

Sebagai catatan tambahan:sepertinya Anda memiliki beberapa duplikasi di tabel Anda (tidak dinormalisasi) siteName harus benar-benar masuk ke tabel terpisah dan hanya dirujuk dari 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. Php memanggil skrip database cadangan sqlserver, file cadangan dibuat dan kemudian dihapus

  2. Transaksi bersarang di Sql Server

  3. Tidak dapat menggunakan UPDATE dengan klausa OUTPUT saat pemicu ada di atas meja

  4. Cara yang baik untuk menggunakan alias tabel dalam pernyataan Perbarui?

  5. Bagaimana kita bisa melihat tubuh prosedur tersimpan terenkripsi di SSMS?