我有一份在指定日期交付商品的制造商列表。例如,制造商 A 可能会在周一和周四交付商品。我需要设计一个显示此信息的页面。该页面基本上包含 7 个复选框,周一到周日,制造商可以打开/关闭设置他们首选的交货日期。
我在 SQL Server 2008 中创建的表将包含制造商 ID,它是充当主键的整数和用于存储交货日期的字段。
交货日期最合适的数据类型是什么?
我有一份在指定日期交付商品的制造商列表。例如,制造商 A 可能会在周一和周四交付商品。我需要设计一个显示此信息的页面。该页面基本上包含 7 个复选框,周一到周日,制造商可以打开/关闭设置他们首选的交货日期。
我在 SQL Server 2008 中创建的表将包含制造商 ID,它是充当主键的整数和用于存储交货日期的字段。
交货日期最合适的数据类型是什么?
假设寻求一天;
我会选择TINYINT
因为;
SELECT DATEPART(WEEKDAY, GETDATE())
将产生一个介于 1-7 之间的整数(包括)
假设需要多天;
编辑:我认为 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 字段并使用按位运算来确定检查的日期(如果您希望能够在执行时轻松查看值,则可以使用 VARCHAR SELECT *
,但您始终可以为此使用计算字段或存储过程) .
单一交货天数:
我只建议存储一个值可以为 0-6 或 1-7 的 INT。