[英]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.