我有一份在指定日期交付物品的制造商名单。例如,制造商A可能在星期一和星期四交付物品。我需要设计一个显示此信息的页面。该页面基本上包含7个复选框,星期一到星期天,制造商可以打开/关闭以设置他们的首选交货日。
我在SQL Server 2008中创建的表将包含一个制造商ID,它是作为主键的整数和存储交付日的字段。
用于交付日的最合适的数据类型是什么?
答案 0 :(得分:2)
假设寻求一天;
我会选择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
答案 1 :(得分:1)
有多个投放日:
最好的想法可能是拥有7个BIT字段。这比在索引方面存储单个INT或VARCHAR以及在查询这些字段时需要扫描的记录数量更有优势。
为了完整起见,我应该注意MySQL有一个可变长度的二进制字段(SQL-Server并不是我所知道的。)
替代方法是使用单个INT字段并使用按位操作来确定检查哪些日期(或者如果您希望在执行SELECT *
时能够轻松查看值,则使用VARCHAR,但是您可以始终使用为此计算的字段或存储过程。)
单日交付日期:
我建议存储一个值为0-6或1-7的INT。