3

使用 SQL Server 和 ASP.NET 时,使用Datevs时是否需要考虑性能/存储DateTime

即使我不需要它,我也一直在使用DateTime

4

3 回答 3

6

DateTime 每个值占用 8 个字节

日期为 3 个字节。

我不能说低水平的表现;但是一般来说,我们发现默认情况下将值存储为 DateTime 是错误的。迟早您会遇到 UTC 问题,并且必须开始计算时间部分中包含 00:00:00.000 的日期的偏移量!

如果您只是存储日期,我会坚持使用 Date 数据类型;您将在每页中放置更多行,并为自己省去很多麻烦

于 2012-04-13T16:38:22.630 回答
1

取决于您存储的行数以及您使用它的目的。日期为 3 个字节,日期时间为 8 个字节。当您拥有数十亿行数据或将其用于索引时,可以快速累加。当然,存储值的分辨率也存在差异。在 date 和 datetime 之间还有其他日期类型,例如 smalldatetime,它们更紧凑,但也有不同的折衷。

SQL 日期/时间类型文档

于 2012-04-13T16:38:53.637 回答
1

注意事项:

  • 性能:日期类型的位数越少意味着每个 sql 页(数据页或索引页)的行数越多执行查询时要读取的页数就越少
  • 兼容性:DATE类型是在 SQL Server 2008 中引入的,因此您的应用程序不再与 SQL Server 2005 兼容
  • .NET:.NET 中没有Date类 -DATE转换为DateTime.NET 类
  • LINQ:LINQ2SQL(和 SQL Metal 工具)非常适合DATESQL 类型
  • DATETIME你可能会从做事中减少几小时和几分钟CAST(@myDateTimeParam AS DATE)

根据我的经验:我喜欢这种新类型,并且在编写 T-SQL 或 C# 时没有遇到任何问题

请注意这一点(为比较日期混合数据类型):

DECLARE @startDay DATE = '2012-04-11' -- day
DECLARE @endDay DATE = '2012-04-13' -- day
DECLARE @eventTime DATETIME = '2012-04-13 12:00' -- point in time (noon)

IF @eventTime BETWEEN @startDay AND @endDay PRINT 'In period.' ELSE PRINT 'Not in period!'

结果是:

Not in period!

我猜在BETWEEN比较@endDay中被归结为DATETIME(到时间点;与 的常见类型@eventTime) - 是什么给出了不直观的结果。

与之比较:

DECLARE @startDay DATE = '2012-04-11' -- day
DECLARE @endDay DATE = '2012-04-13' -- day
DECLARE @eventTime DATE = '2012-04-13' -- day

IF @eventTime BETWEEN @startDay AND @endDay PRINT 'In period.' ELSE PRINT 'Not in period!'

结果:

In period.

有了它:

DECLARE @startDay DATETIME = '2012-04-11' -- day, but point in time in fact 00:00.000
DECLARE @endDay DATETIME = '2012-04-13' -- day, but point in time in fact 00:00.000
DECLARE @eventTime DATETIME = '2012-04-13' -- day, but point in time in fact 00:00.000

IF @eventTime BETWEEN @startDay AND @endDay PRINT 'In period.' ELSE PRINT 'Not in period!'

结果:

In period.
于 2012-04-13T21:47:56.140 回答