Sql server 在SQL Server中存储季度和年度的最佳方法?
在数据库中存储季度和年度的最佳方法是什么?我有一个付款表,我需要指定季度/年度,这样就可以很容易地知道是哪个季度付款的 我在想: a) 向每笔付款添加两个int列Sql server 在SQL Server中存储季度和年度的最佳方法?,sql-server,sql-server-2008,sql-server-2008-r2,Sql Server,Sql Server 2008,Sql Server 2008 R2,在数据库中存储季度和年度的最佳方法是什么?我有一个付款表,我需要指定季度/年度,这样就可以很容易地知道是哪个季度付款的 我在想: a) 向每笔付款添加两个int列 b) 添加另一个表,并添加可能的值(最多5年),然后使用ID将该表与一个表连接起来 还有什么其他选择?也许有些更好或更容易维护。这个数据库将与C#程序一起使用。对于如此简单的事情,我只保留两个int列,并在需要使用日期范围时使用dateadd来建立(关键的)日期 另一个选项是单日期列,您可以为其存储季度的第一天,因此一年中的4个日期为
b) 添加另一个表,并添加可能的值(最多5年),然后使用ID将该表与一个表连接起来
还有什么其他选择?也许有些更好或更容易维护。这个数据库将与C#程序一起使用。对于如此简单的事情,我只保留两个int列,并在需要使用日期范围时使用dateadd来建立(关键的)日期
另一个选项是单日期列,您可以为其存储季度的第一天,因此一年中的4个日期为1月1日、4月1日、7月1日、10月1日。您可以使用datepart Q和Y轻松提取季度、年份。两个整数如何,一个用于年度,一个用于季度(1-4)。这就是你所说的选项“a”的意思吗
选项“b”会起作用,但您必须记住每年左右维护该表。如果您必须使用单独的年度和季度而不是日期(因为您似乎有特定的报告要求),我会为季度选择一个
tinyint
,为年度选择smallint
,并将它们存储在PAYMENT
表中
我不会把它放在另一张桌子上。这很糟糕,因为:
- 你必须确保你有足够的年/季产量
- 您必须加入并使用外键
在这种情况下,您需要对所有项目使用覆盖索引,但仍然没有帮助,因为您的查询针对的是特定的季度,而不是季度年份。但是,将数据放在表中有助于制定更轻的执行计划。根据付款日期使用如何?我宁愿这样做,也不希望日期和季度/年都不同步。另一方面,我想你可能需要一个不同于日期的年/季度,在这种情况下,你需要将它们分开。我至少会考虑使用计算列,因为这似乎是确保完整性的最佳方法。我同意两个int就可以了
我会添加一个由两列组成的索引,以防您需要按年度和季度进行排序或筛选。您甚至可以使用单个
tinyint
。它足够以YYQ的形式存储,比如111112113114121…几年。我总是使用datetime值,1月/4月/7月/10月1日代表每个季度。使季度开始/结束日期的计算变得简单:
- 开始日期:
列本身datetime
- 结束数据:
dateadd(月、3、四分之一列)
- 2011-01-01/P3M
- 2011-04-01/P3M
- 2011-07-01/P3M
- 2011-10-01/P3M
- 2011年第一季度
- 2011年第二季度
- 2011年第三季度
- 2011年第4季度
Table 1: Payments
-----------------
paymentID (int)
paymentAmount (double(7,2))
paymentDateTime (DateTime)
Table 2: QuarterYear
--------------------
quarterYearID (int)
dateFrom (date)
dateTo (date)
quarter (tinyint)
description (varchar)
示例数据
paymentID | paymentAmount | paymentDateTime
------------------------------------------------
1 | 20.24 | 2011-04-18 08:14:20
2 | 34.15 | 2011-04-19 07:42:15
3 | 51.87 | 2011-04-20 13:04:22
quarterYearID | dateFrom | dateTo | quarter | description
-----------------------------------------------------------------
1 | 2011-01-01 | 2011-03-31 | 1 | first quarter
2 | 2011-04-01 | 2011-06-30 | 2 | second quarter
3 | 2011-07-01 | 2011-09-31 | 3 | third quarter
4 | 2011-10-01 | 2011-12-31 | 4 | forth quarter
获取“第二季度”所有付款的示例查询
dateValue是从payments表中动态提取的变量。C#将处理“dateValue”值
SELECT quarter FROM QuarterYear WHERE cast('dateValue' AS date) BETWEEN dateFrom AND dateTo;
对于每次付款还是使用表联接?数据库将会很小(我想少于1GB)。谢谢你的建议和清晰的解释。我会接受你的回答,只要Stack让我:)谢谢。我要tinyint和int。这就是我对选项a的想法:-)付款日期不起作用。通常,员工会在季度结束后记录付款。我需要存储错误的日期或季度的最后一天才能使用它。IMO,这是正确的方法。想象一下,如果它们从一个日历年的季度变为一个会计年度的季度。更好的办法是在一个容易改变的地方确定四分之一桶的逻辑。@MadBoy-我想你想到的是两个不同的日期。一个日期显然与季度有关(可能是收到日期?)。另一个日期与输入日期有关。这些应该是分开的。应该是这样的,如果付款日期(我描述的第一个)改变了,季度也随之改变。不会有这样的变化。我们的客户需要在12个季度左右的时间内每季度获得一次发票。我需要能够区分付款是否已经完成