簡體   English   中英

SQL Server 2008中工作日的數據類型

[英]Datatype for weekdays in SQL Server 2008

我有一個制造商列表,在指定的日期提供物品。 例如,制造商A可能在星期一和星期四交付物品。 我需要設計一個顯示此信息的頁面。 該頁面基本上包含7個復選框,星期一到星期日,制造商可以打開/關閉以設置他們的首選交付日。

我在SQL Server 2008中創建的表將包含一個制造商ID,它是作為主鍵的整數和存儲交付日的字段。

什么是最適合交貨日的數據類型?

假設尋求一天;

我會選擇TINYINT因為;

SELECT DATEPART(WEEKDAY, GETDATE())

將導致1-7(incl)之間的整數

假設尋求多天;

編輯:我認為n:n解決方案可能表現更好但尚未確認。

您是否有興趣尋求這樣的解決方案? 我之所以選擇這種方法是因為我覺得它比擁有n:n表更“整潔”。 我們可以在您擴展您的要求時對其進行擴展。

USE tempdb
GO

IF OBJECT_ID('tempdb.dbo.Manufacturer') IS NOT NULL DROP TABLE Manufacturer
IF OBJECT_ID('tempdb.dbo.DeliveryDays') IS NOT NULL DROP TABLE DeliveryDays
CREATE TABLE [dbo].[Manufacturer](
    [ManufacturerID] [int] IDENTITY(1,1) NOT NULL,
    [Manufacturer] [varchar](50) NOT NULL,
    [DeliveryDaysBinScore] [int] NULL,
 CONSTRAINT [PK_Manufacturer] PRIMARY KEY CLUSTERED 
(
    [ManufacturerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE DeliveryDays
(
     WeekdayNum INT
    ,tDayName   VARCHAR(9)
    ,DayBinVal  INT
)
INSERT INTO DeliveryDays VALUES 
(1, 'Sunday', 1),
(2, 'Monday', 2),
(3, 'Tuesday', 4),
(4, 'Wednesday', 8),
(5, 'Thursday', 16),
(6, 'Friday', 32),
(7, 'Saturday', 64)

/*
    Sunday      = 1 = 1
    Monday      = 2 = 2
    Tuesday     = 3 = 4
    Wednesday   = 4 = 8
    Thursday    = 5 = 16
    Friday      = 6 = 32
    Saturday    = 7 = 64
*/

INSERT INTO Manufacturer VALUES
('ABC Co', 16 + 1), ('Boxer PTY', 64+8), ('ConsumeIT', 1+4+16)

SELECT *
FROM Manufacturer   M
JOIN DeliveryDays   D ON M.DeliveryDaysBinScore & D.DayBinVal != 0

有多個交貨日:

最好的想法可能是擁有7個BIT字段。 這比在索引方面存儲單個INT或VARCHAR以及在查詢這些字段時需要掃描的記錄數量有優勢。

為了完整起見,我應該注意MySQL有一個可變長度的二進制字段(SQL-Server並不是我所知道的)。

另一種方法是使用單個INT字段並使用按位運算來確定檢查哪些日期(或者如果您希望在執行SELECT *時能夠輕松查看值,則可以使用VARCHAR,但是您始終可以使用計算字段或存儲過程這個)。

單日交貨日期:

我建議存儲一個值為0-6或1-7的INT。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM