SqlDateTime溢出异常

时间:2008-10-28 16:52:32

标签: sql-server vb.net

我正在尝试插入仅限时间的值,但会收到以下错误

  
      
  • ex {“SqlDateTime overflow。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。”} System.Exception
  •   

从前端开始,使用“TimeEdit”控件选择时间,使用向上和向下箭头。 SQL Server中的表将字段设置为smalldatetime。我只需要存储时间。我使用以下内容将数据返回到应用程序

选择id,CONVERT(CHAR(5),timeFrom,8)作为timeFrom,CONVERT(CHAR(5),timeTo,8)作为timeTo 来自dbo.Availability 其中id = @id 和dayName = @weekday

如何将时间仅传递给桌面?

编辑〜解决方案 根据Euardo和Chris,我的解决方案是传递日期时间字符串而不是仅限时间字符串。我使用“g”按照Time Format格式化了我的结果。

由于

4 个答案:

答案 0 :(得分:3)

您可以将日期设置为1/1/1753,它是MSSQL中datetime的日期最小值,然后添加您要存储的小时。当然,每次需要获取值时都必须考虑这个问题,但是你可以用一些帮助器来包装它。 或者您可以使用MSSQL 2008并使用新的TIME数据类型。

答案 1 :(得分:1)

选择一个范围内的日期(即1970年1月1日)并将其用于您插入的所有内容。

答案 2 :(得分:0)

如果你只是跟踪时间,那么考虑将它存储在int中作为从午夜到你需要的任何粒度(秒,分钟,小时......)的偏移量。然后,您可以使用适当的TimeSpan.From ??()方法将其转换为代码中的TimeSpan。要以另一种方式返回,您可以使用TimeSpan.Total ??并且如果需要则截断。如果需要进行手动查询,可以编写一个将小时/分钟/秒转换为等效偏移量的SQL函数。

我更喜欢使用日期时间并选择任意一天,因为它可以使字段的目的更清晰,从而减少混淆。

答案 3 :(得分:-1)

在SQL中没有Time,只有DateTime。

为了您的目的,我会使用这样的东西只返回时间部分。

SELECT (GETDATE() - (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime)))

其中GETDATE()是您要过滤的日期时间。

在数据库中设置时间时,您必须添加'01 / 01/1901'或'01 / 01/1753'。

使用日期时不要使用CAST和转换为varchar,它很慢。坚持浮动数值运算。