Jac*_*all 11 sql-server-2008 sql-server date-format
我正在使用一个系统,其中日期存储为整数(实际数字(8,0)),我注意到其他系统也将日期存储为 int ,例如在此线程中的 cisco。例子
20120101 -- 01 Jan 2012
Run Code Online (Sandbox Code Playgroud)
保持数字日期系统而不使用 SQL 日期时间有什么好处吗?
现在我正在尝试遍历数字日期以查找两个日期之间的客户。如果start
和enddate
包含两个月,我会得到数千条记录,而不仅仅是 60 条记录。例如:
create table #temp1(day int,capacity int) /* just a temp table */
declare @start int
declare @end int
set @start=20111201
set @end = 20120131
while (@start <= @end)
Begin
insert into #temp1 /* I am storing things in #temp table so data looks pretty */
exec usp_GetDailyCap @date1= @start
set @start = @start + 1;
end
select * from #temp1
Run Code Online (Sandbox Code Playgroud)
这会提取 8931 条记录而不是 60 条记录。有没有更好的方法来改进上述逻辑,以便我只提取有效日期?我尝试了 IsDate 和子查询,但这并不能有效地工作。
Tho*_*ger 11
要回答您的第一个问题,我建议使用DATETIME
SQL Server 中的数据类型。不一定是出于性能原因,而是为了利用 RDBMS 特定的功能。例如,你将不得不重新发明了很多的逻辑只是做基本的数学日期(想想DATEDIFF()
,DATEADD()
,DATEPART()
和许多其他功能。他们显然是量身定做的DATETIME
数据类型,很容易与工作)。
至于你的第二个问题,你遇到了第一个问题(和我的答案)针对的确切问题。 您将 20111201 和 20120131 视为日期,您的大脑告诉您应该相差 60 天。好吧,您正在根据 delta 进行循环……即:
20120131 - 20111201 = 8930
(使用包含循环,它将是 8931)
换句话说,您的WHILE
循环执行了 8931 次。发生这种情况是因为这些是整数值,您的循环不会从 20111231 直接跳转到 20120101。
您的整数不会考虑年和月的上限(即您的问题 2问题)。
您可以使用日历表并为您的日期发出连续数字,如下所示:
日期编号
20120229 1234
20120301 1235
必须生成日历表,但这是一项非常简单的任务。
潜在的数据类型及其大小/限制:
数字数据类型的优点:
数字数据类型的缺点:
老实说,您最好使用日期数据类型恕我直言。
归档时间: |
|
查看次数: |
23227 次 |
最近记录: |