我正在构建一个应该存储在数据库中的每日报价的应用程序。每个报价分配一年中的一天,包括2月29日的一天。由于引用只关心那一天不是一年,我还应该使用smalldatetime类型吗?请让我知道你的意见,谢谢!!
答案 0 :(得分:17)
我最近遇到了这个问题,我的初始设计确实存储了日期,而我却忽略了这一年。但是,它只是没有感觉正确。我决定将其删除,并改为使用单独的Day
/ Month
列。它感觉更清洁,更具可读性。
<强>更新强>
自从我写这个答案以来,很长一段时间,事后我举起手来说这些评论被天真地忽略了。通过将日/月存储为单独的字段,可能存储无效数据,而如果您将它们存储为完整的DateTime
,则您实际上可以免费获得该验证。
根据您的验证政策,这可能不是一个问题,但是,如果您依赖数据库验证,那么我建议您将其存储为DATE
,只需提取相关信息或使用触发器运行在插入之前进行一些验证。
答案 1 :(得分:7)
另一种选择(我认为其他人没有提供)是将月份和日期存储为单独的整数。所以,要找到今天的条目,你可以:
select quote from quoteTable where month = 4 and day = 20;
这将允许您在不使用日期(并忽略年份)的情况下获取特定日期的消息。
只是一个想法。
答案 2 :(得分:3)
这取决于您与这些日期有什么关系。 如果您的数据库中的年份不是问题,那么您可以使用闰年并使用它来存储日期,在您的应用程序视图中忽略它。
答案 3 :(得分:2)
如果您需要保留日期和月份数据,您也可以使用SmallDateTime
并忽略年份组件(或将其设置为全面的相同值,例如2000年是闰年,所以允许闰日。
您仍然可以使用正确的数据类型使用正确的日期和时间函数,如果您使用VARCHAR字段,您将最终转换为它。
答案 4 :(得分:1)
由于没有像Oracle这样的Interval类型,因此您会想到一些选择中的一个。
答案 5 :(得分:1)
如何直接运行数字。您可以每次随机选择引号,并在选择时标记另一个布尔字段。您可以在年底重置布尔字段。
这也允许您随着时间的推移向数据库添加更多引号,而不必删除已有的引号。
答案 6 :(得分:1)
如果日历是由软件工程师发明的,闰日将是12月32日而不是2月29日,我感到无法理解。这样你就可以简单地使用一个小的偏移1月1日。
你仍然可以使用从3月1日起的一个小的偏移量,3月1日为0,3月2日为2月29日为365.但是它涉及做某种自定义转换到你想要的数字,可能不会排序如你所愿。
鉴于您可以将日期和月份存储为占据相同空间的两个小文件,我不确定这是一个好的计划,但我认为我会提及它的完整性。
答案 7 :(得分:0)
您仍然可以在数据库中使用datetime列,并使用DatePart()SQL函数来检索一年中的某一天。
SELECT datepart(dy,myDateColumn) FROM myTable
答案 8 :(得分:0)
我会避免使用日期时间。从某种意义上说,你将存储不正确的数据。例如,您将在2012年4月20日或您选择的任何年份存储4/20/2010。即使年份与您的申请无关,这种方法可能会导致一些意想不到的问题。
例如,如果你以错误的一年在那里得到约会怎么办?你的计算是错误的。
由于没有本机类型可以支持你正在做的事情,我会将值存储为varchar并在用户定义的函数中进行任何必要的计算。
答案 9 :(得分:0)
0305的varchar是3月5日怎么样。
答案 10 :(得分:0)
您还可以考虑使用单个int来存储一年中的某一天。
在人类可读格式和每年的日期之间进行翻译可能会有点痛苦。另一方面,将日期分配给报价并选择它们将非常容易。
SELECT quote FROM QuoteTable
WHERE dayOfYear = DATEPART(dy, GETDATE())
答案 11 :(得分:-2)
CONVERT(VARCHAR(5),GETDATE(),101)