1

我有一份在指定日期交付商品的制造商列表。例如,制造商 A 可能会在周一和周四交付商品。我需要设计一个显示此信息的页面。该页面基本上包含 7 个复选框,周一到周日,制造商可以打开/关闭设置他们首选的交货日期。

我在 SQL Server 2008 中创建的表将包含制造商 ID,它是充当主键的整数和用于存储交货日期的字段。

交货日期最合适的数据类型是什么?

4

2 回答 2

2

假设寻求一天;

我会选择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
于 2013-01-04T08:26:24.937 回答
1

有多个交货日:

最好的想法可能是拥有 7 个 BIT 字段。在索引和查询这些字段时需要扫描的记录数量方面,这比存储为单个 INT 或 VARCHAR 具有优势。

为了完整起见,我应该注意 MySQL 有一个可变长度的二进制字段(据我所知,SQL-Server 没有)。

另一种方法是使用单个 INT 字段并使用按位运算来确定检查的日期(如果您希望能够在执行时轻松查看值,则可以使用 VARCHAR SELECT *,但您始终可以为此使用计算字段或存储过程) .

单一交货天数:

我只建议存储一个值可以为 0-6 或 1-7 的 INT。

于 2013-01-04T08:23:41.900 回答