好的,我有一个看起来像这样的专栏:
20140813000000000
它以decimal(17,0)
的格式显示日期,但我需要从中取出前8个字符,将其转换为日期以便可以使用。我已尝试casting
和converting
以及substring
,但所有内容都会导致算术溢出。有关获取该日期的任何帮助吗?
我正在使用的示例和错误:
CAST(SUBSTRING(CAST([tblDate] as varchar),1,8) as Date)
Conversion failed when converting date and/or time from character string.
答案 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
您的回答会为第一个值抛出异常。
如果您确定您的数据总是全部为零或包含要解析的日期,那么很好......