Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中存储季度和年度的最佳方法?_Sql Server_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql server 在SQL Server中存储季度和年度的最佳方法?

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个日期为

在数据库中存储季度和年度的最佳方法是什么?我有一个付款表,我需要指定季度/年度,这样就可以很容易地知道是哪个季度付款的

我在想:

a) 向每笔付款添加两个int列
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、四分之一列)
另一种选择是。这是一个用于互联网协议的ISO8601配置文件:(建议的标准)

2011年每个季度的ISO 8601表示如下:

  • 2011-01-01/P3M
  • 2011-04-01/P3M
  • 2011-07-01/P3M
  • 2011-10-01/P3M
上面通过开始日期和持续时间(在本例中为3个月)指定了持续时间

ISO 8601日期/时间格式的优点在于:(A)字符串是人类可读的,(B)它们能够正确地进行校对,(C)它们易于解析,(D)它是一个国际标准

有些人将ISO 8601的周表示法“扩展”为四分之一表示法,其中一年中的一周类似于2011年的第32周。使用这个非官方的扩展,2011年的季度看起来如下:

  • 2011年第一季度
  • 2011年第二季度
  • 2011年第三季度
  • 2011年第4季度

在数据库中存储季度和年度取决于您的支付数据的组织方式。例如:;插入了多少不同的付款值。季度/年度范围是否会有所不同?等等

“定义”季度/年度范围的一个好方法是创建一个单独的表,其中包含标识季度的“DateTime”字段。你不需要加入这个表,你只需要用C语言编程来确定这个范围是否在某个特定的工资季度内

例如:

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个季度左右的时间内每季度获得一次发票。我需要能够区分付款是否已经完成