2017-07-19 100 views
0

我有一个表INTEG_LOG其中包含日期列DATE_LOG。从那天起,我需要以20171907的格式提取日期和094225这样的小时。CONVERT抛出错误转换数据类型日期为varchar

首先,我试图找到我的约会。为此我使用这条线:

SELECT 
    REPLACE(CONVERT(VARCHAR(10), DATE_LOG, 111), '/', '') AS LOG_DATE 
FROM 
    INTEG_LOG 

它不是很干净,但它工作正常。

我决定与该行的时间做同样的:

SELECT 
    REPLACE(CONVERT(VARCHAR(8), DATE_LOG, 108), ':', '') AS LOG_HOUR 
FROM 
    INTEG_LOG 

但这SQL抛出

错误转换数据类型日期为varchar

我甚至尝试没有替换,我仍然得到相同的错误。

我真的不知道为什么与风格111第一个转换工作正常,但不是108

我使用SQL Server 2008 R2。

感谢

+3

哪个版本** * *您正在使用SQL Server吗?而** datatype **是那一列'DATE_LOG'?你说这是一个“日期”列 - 但如果它确实是数据类型“DATE”,那将不包含任何时间部分..... –

+0

对我来说 - 对于我来说 - 用SQL Server 2014和'DATETIME2(3)' (甚至'DATETIME')数据类型列 - 此代码工作正常 –

+0

感谢您的答案,我添加了SQL Server的版本。当我检查我的专栏时,这是一个约会。我已经使用GETDATE()尝试了这些请求,并且它工作正常。你说得对,当我把我的专栏改成日期时间的时候它就起作用了。谢谢 – nebra

回答

2

我有其中包含日期列DATE_LOG

你得到的错误是合法的表INTEG_LOG因为日期类型没有时间组件,所以你不能将它转换成字符串使用样式108

试试这个

select REPLACE(CONVERT(VARCHAR(100), CAST(getdate() AS DATE), 108), ':', '') 

你会得到同样的错误。

所以,你应该只选择一个常数是这样的:

select '000000' AS LOG_HOUR 

或可选择地投你的日期日期时间,你会使用你的代码得到泰姆:

SELECT 
    REPLACE(CONVERT(VARCHAR(8), cast(DATE_LOG as datetime), 108), ':', '') AS LOG_HOUR 
FROM 
    INTEG_LOG 
相关问题