如何在表中的SQL中存储小时datepart

如何在表中的SQL中存储小时datepart,sql,sql-server,Sql,Sql Server,我有一个包含两列的表:Customer\u ID,它是一个字符串,用于标识每个客户机;Time\u ID:一个包含14个字符的字符串,用于标识事务的时间戳。例如: Customer_id; Time_id 12345; 20140703144504 我希望能够在小时datepart中使用datediff,但似乎无法正确转换时间id。我使用以下查询: update transation_table set time_id= ( convert(timestamp, time_id) ) 它可以

我有一个包含两列的表:Customer\u ID,它是一个字符串,用于标识每个客户机;Time\u ID:一个包含14个字符的字符串,用于标识事务的时间戳。例如:

Customer_id; Time_id
12345; 20140703144504
我希望能够在小时datepart中使用datediff,但似乎无法正确转换时间id。我使用以下查询:

update transation_table
set time_id= (
convert(timestamp, time_id)
)
它可以工作,但删除了datepart,这正是我需要的。对于day datepart,我可以转换为datetime。我怎样才能把这张桌子放在桌子上

编辑:我正在运行MS SQL Server 2014


最好的祝愿

使用下面的转换和字符串连接,您可以对结果值使用DATEPART

DECLARE @tmp TABLE(
    Customer_id VARCHAR(50),
    Time_id VARCHAR(50)
)

INSERT INTO @tmp
    SELECT '12345','20140703144504'

select
    *,CONVERT(DATETIME,
        SUBSTRING(Time_id,5,2) + '/' +
        SUBSTRING(Time_id,7,2) + '/' +
        SUBSTRING(Time_id,1,4) + ' ' +
        SUBSTRING(Time_id,9,2) + ':' +
        SUBSTRING(Time_id,11,2) + ':' +
        SUBSTRING(Time_id,13,2)
        ,101
    )
from @tmp
用于获取a中值的字符串表示形式(日期和时间样式图表中的ODBC canonical),然后用于返回实际的日期时间值:

SELECT TRY_CONVERT(DATETIME,
                   FORMAT(CAST('20140703144504' AS BIGINT),
                          '####-##-## ##:##:##'),
                   120);
这需要SQL Server 2012+


如其他地方所述,数据应存储在单列中,或成对和列中。上述功能可用于帮助将现有数据转换为新列

请用你正在使用的数据库标记你的问题。这是什么样的时间戳?您在哪里生成它?啊,现在我看到了,这不是时间戳这看起来就像是一个正常的日期时间值2014-07-03 14:45:04,在这里您刚刚去掉了
-
为什么不首先将此数据存储在一个适当类型的列中?您是对的,用词不当!:)我不知道它是如何产生的。这是正确的,它是一个datetime值,但是如果我没有弄错的话,我需要它有使用datediff的时间的正式定义。就像我说的,对于day datepart来说,它工作得很好,datediff也一样。当我将其用于day datepart时,我使用left命令将其从hh mm ss中剥离出来。由于您保存的“时间戳”格式在未来7000年内可能不会改变,因此您可以使用
STUFF(STUFF(STUFF(STUFF('20140703144504',5,0',-')、8,0',-')、11,0',14,0',:')、17,0',:'))
将其转换为标准化的日期格式(如
2014-07-03 14:45:04
),然后可以通过
DATEPART
轻松转换或处理,例如确定小时部分。如果要将字符串转换为可转换为
datetime
的格式,请,至少可以将其转换为明确的格式,或者至少在
CONVERT
调用中指定一个样式参数。目前这两种情况都不存在,最终可能会生成一个日期时间,即3月7日或7月3日。