从小数中拉出数字

时间:2014-08-13 12:50:39

标签: sql sql-server casting decimal

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

 20140813000000000

它以decimal(17,0)的格式显示日期,但我需要从中取出前8个字符,将其转换为日期以便可以使用。我已尝试castingconverting以及substring,但所有内容都会导致算术溢出。有关获取该日期的任何帮助吗?

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

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

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

2 个答案:

答案 0 :(得分:1)

我得到了它的工作,我添加了一个案例,在将其作为日期投射之前将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)

答案 1 :(得分:1)

很高兴您找到了解决您自己问题的方法,但请注意,如果您的表中有00000000000000001之类的值,这将无效,因为它将转换为1,在CASE语句中传递第一个测试然后抛出异常,因为1赢了CAST到DATE。

这更啰嗦,但更安全......(包括完整示例):

DECLARE @TestTable TABLE ([tblDate] NUMERIC(17,0));
INSERT INTO @TestTable VALUES(00000000000000001); --Edge case
INSERT INTO @TestTable VALUES(20140831000000001); --Value to parse
SELECT 
    CASE 
        WHEN SUBSTRING(REPLACE(RIGHT('00000000000000000' + CAST([tblDate] AS VARCHAR(17)), 17), SPACE(1), '0'), 1, 8) = '00000000' THEN NULL 
        ELSE SUBSTRING(CAST([tblDate] AS VARCHAR(17)), 1, 8) 
    END
FROM 
    @TestTable;

返回:

NULL
2014-08-31

您的回答会为第一个值抛出异常。

如果您确定您的数据总是全部为零或包含要解析的日期,那么很好......