【问题标题】:How to Insert varchar data into a datetime field (SQL Server 2005)?如何将 varchar 数据插入日期时间字段(SQL Server 2005)?
【发布时间】:2013-02-10 15:41:01
【问题描述】:

我有想要插入到表中的数据。样本数据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 数据类型到 datetime 数据类型的转换导致 datetime 值超出范围。

【问题讨论】:

    标签: sql tsql sql-server-2005 varchar


    【解决方案1】:

    在处理datetime 数据时不要使用varchar。 SQL Server 2005 提供enough tools 让您能够避免转换。

    以下是或多或少的known methoddatetime 值中删除时间部分:

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

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

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

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

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

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

    【讨论】:

    • 完美!感谢您的完整解释。
    【解决方案2】:

    为什么不干脆做

    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/10/2013 11:58:28 PM'。我需要输出是这样的,而不是 2/10/2013 12:00:00 PM
    • 我修改后的答案给了我 2013-02-11 12:00:00.000。格式是本地设置的功能,我的与您的不同。但是,该值是正确的。
    • 谢谢,但我得到了这个输出:'2/12/2013 12:38:00 PM'。我需要一个标准输出,就像“2/12/2013 12:00:00 PM”一样。 12:00:00 PM 是不变的。
    • 你不能在 mssql 2005 中使用日期
    • 这是我使用的: dateadd(hour, 12, cast(cast(dateadd(day, 1, getdate()) as datetime) as datetime)) 并得到这个输出 '2/12/ 2013 年下午 12:38:00”。我需要将时间部分设置为下午 12:00:00。
    【解决方案3】:

    datetime 类型包含日期+时间。在您的情况下,@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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多