如何将varchar数据插入日期时间字段(SQL Server 2005)?

时间:2013-02-10 15:41:02

标签: sql tsql sql-server-2005 varchar

我想将这些数据插入到表格中。示例数据MM/DD/YYYY + 1天和12:00:00 PM

基本上我需要的是插入当前日期+ 1天和特定时间12:00:00 PM。

我的代码是:

DECLARE @MyEstimatedDate as varchar(100)    ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate1 as varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate2 as varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate3 as DATETIME       ---FINAL DATA NEEDED. This is the data I want inserted.

SET @MyEstimatedDate = DATEADD(day,1,GETDATE()) 
SET @MyEstimatedDate1 = CONVERT(VARCHAR(100),@MyEstimatedDate,101)
SET @MyEstimatedDate2 = @MyEstimatedDate1 + ' 12:00:00 PM'
SET @MyEstimatedDate3 = cast(@MyEstimatedDate2 as datetime)  ---I believe this is the error

我收到错误消息:

  

将char数据类型转换为日期时间数据类型会导致日期时间值超出范围。

3 个答案:

答案 0 :(得分:2)

操纵varchar数据时,请勿使用datetime。 SQL Server 2005提供enough tools,以便您能够避免转换。

以下是从datetime值中删除时间部分的known method或多或少DATEDIFF

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @InputDateTime), 0);

在上面的示例中,DATEADD计算指定为0的日期与给定日期之间的天数。然后,{{3}}函数会将天数添加到0日期。最终结果是datetime值,时间为00:00:00,日期与@InputDateTime相同。这是因为0日期是1900-01-01 00:00:00的整数表示:它的时间部分为零,因为我们将它增加了一整天,所以结果的时间部分也是如此。

现在,如果您添加DATEDIFF而不是DATEDIFF+1天,您将在第二天获得。此外,如果您使用0代替12:00作为要递增的日期,您将获得第二天的中午,这似乎是您想要的。所以,最终的表达式将如下所示:

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @InputDateTime) + 1, '12:00');

由于您的输入时间戳应该是当前日期&时间,只需将@InputDateTime替换为GETDATE()

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) + 1, '12:00');

答案 1 :(得分:0)

为什么不简单地做

cast(dateadd(day, 1, getdate()) as date)
那是午夜。中午,这样做

dateadd(hour, 12, cast(cast(dateadd(day, 1, getdate()) as date) as datetime))  

忘了以上,这是错误的。

正确答案是

dateadd(hour, 12, cast(cast(dateadd(day, 1, getdate()) as date) as datetime))  

这次我甚至测试了它。

答案 2 :(得分:0)

日期时间类型包含日期+时间。在你的情况下@ MyEstimatedDate1需要一个日期

DECLARE @MyEstimatedDate varchar(100)    ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate1 varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate2 varchar(100)   ---TEMPORARY CONTAINER
DECLARE @MyEstimatedDate3 DATETIME       ---FINAL DATA NEEDED. This is the data I want inserted.

SET @MyEstimatedDate = DATEADD(day, 1, GETDATE()) 
SET @MyEstimatedDate1 = CONVERT(VARCHAR(100), CAST(@MyEstimatedDate AS date), 101)
SET @MyEstimatedDate2 = @MyEstimatedDate1 + ' 12:00:00 PM'
SET @MyEstimatedDate3 = cast(@MyEstimatedDate2 as datetime)   ---I believ

或者简单易用

SELECT DATEADD(hour, 36, GETDATE() - CAST(GETDATE() AS time))