SQL Server 2008中工作日的数据类型

时间:2013-01-04 07:50:36

标签: sql database sql-server-2008

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

我在SQL Server 2008中创建的表将包含一个制造商ID,它是作为主键的整数和存储交付日的字段。

用于交付日的最合适的数据类型是什么?

2 个答案:

答案 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。