【问题标题】:Datetime from a Datetime2 and Varchar column来自 Datetime2 和 Varchar 列的日期时间
【发布时间】:2016-10-17 16:11:35
【问题描述】:

为简单起见,我在一个表中有两列

DATE =  DateTime2(7)  2016-06-16 00:00:00.000000 
TIME =  Varchar(5)    09:00

我已经尝试了如下示例中所示的几种强制转换和转换,以尝试将它们组合到一个新列中,如 2016-06-16 09:00:00.000000 格式的 DateTime: p>

convert(datetime, 
convert(varchar(10),DATE, 121) + ' ' + convert(varchar(8),TIME, 108)) 
as 'DateTime'

但我不断收到此错误:

从字符串转换日期和/或时间时转换失败。

感谢任何帮助。

【问题讨论】:

  • varchar(5) 如何存储 15 个字符?
  • 抱歉,我会修改它。
  • 如何将(显然)逻辑上的单个值分成两个单独的列“为简单起见”。当然,它引入了更多问题 - 首先是重新组合它们(如这里)。其次,你在那个时间列上有一个像样的CHECK 约束吗?确保它不包含25:73today?
  • 谢谢达米安。我无法控制数据,因为它是我们可以通过 SQL 访问的外部系统,因此我需要在一列中使用它。还对数据输入进行了检查,以阻止用户以不正确的格式输入数据。

标签: sql sql-server-2008 datetime


【解决方案1】:
DECLARE @DATE  DateTime2(7) =  '2016-06-16 00:00:00.000000' 
DECLARE @TIME Varchar(15) = '09:00:00.000000'

SELECT  CAST(
            CAST(@DATE as date) 
        as datetime) + 
        CAST(
            CAST(@TIME as time) 
        as datetime) As DateTimeValue

结果:

DateTimeValue
-----------------------
2016-06-16 09:00:00.000

【讨论】:

    【解决方案2】:

    您的time 已经是一个字符串。所以你应该这样做:

    convert(varchar(10), [DATE], 121) + ' ' + [TIME]
    

    如果您只想要 HH:MM:SS 格式,请使用 LEFT():

    convert(varchar(10), [DATE], 121) + ' ' + LEFT([TIME], 8)
    

    这会返回一个字符串。

    请注意,您可以只添加 datetime 值,因此您可以这样做:

    select [DATE] + CAST([TIME} as DATETIME)
    

    【讨论】:

    • 优秀。谢谢戈登。第一个正是我需要的。我尝试了类似的变体,但无法完全正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2017-10-14
    • 2016-09-19
    相关资源
    最近更新 更多