Sql 从小数中提取数字

Sql 从小数中提取数字,sql,sql-server,casting,decimal,Sql,Sql Server,Casting,Decimal,好的,我有一个专栏,看起来像这样: 20140813000000000 它以十进制(17,0)的格式显示一个日期,但我需要从中取出前8个字符,将其转换为日期,以便使用。我尝试了转换和转换和子字符串,但一切都会导致算术溢出。有没有人帮我约会 我正在使用的内容和错误示例: CAST(SUBSTRING(CAST([tblDate] as varchar),1,8) as Date) Conversion failed when converting date and/or time from

好的,我有一个专栏,看起来像这样:

 20140813000000000
它以
十进制(17,0)
的格式显示一个日期,但我需要从中取出前8个字符,将其转换为日期,以便使用。我尝试了
转换
转换
子字符串
,但一切都会导致算术溢出。有没有人帮我约会

我正在使用的内容和错误示例:

CAST(SUBSTRING(CAST([tblDate] as varchar),1,8) as Date)

Conversion failed when converting date and/or time from character string.

我让它工作了,我添加了一个案例,在将0转换为日期之前将其过滤为NULL:

Select
    CAST(CASE
        WHEN SUBSTRING(CAST([tblDate] as varchar),1,8) = 0 THEN NULL
        ELSE SUBSTRING(CAST([tblDate] as varchar),1,8)
    END as DATE)

很好,您找到了自己问题的解决方案,但是请注意,如果您的表中有类似0000000000000000 1的值,那么这将不起作用,因为它将转换为1,通过CASE语句中的第一个测试,然后抛出异常,因为1到目前为止不会强制转换

这更冗长,但更安全。。。(包括完整示例):

返回:

NULL
2014-08-31
您的答案将为第一个值引发异常


如果您确定您的数据将始终为全零或包含要分析的日期,那么很好…

您使用的是哪个数据库?我尝试了以下操作:选择CAST(子字符串(CAST(201408130000000作为VARCHAR),1,8作为日期);而且效果很好。所以我猜您的表中有一些特定的值导致了这个问题?@rich但使用哪个数据库?也许这对他的dbI不起作用。我正在使用Microsoft SQL Server Management Studio。同意,了解所涉及的数据库类型是关键。从语法上看,我猜是SQL Server,但我可能错了?添加一些语法糖:
选择CAST(NULLIF(左(CAST([tblDate]为varchar(17)),8),'00000000')为date)
NULL
2014-08-31