如何在SQL中将5位数或6位数的十进制转换为日期

时间:2018-10-18 13:49:51

标签: sql sql-server

我有一列以小数形式显示日期,例如10-11-18的101118和09-01-18的90118。我正在尝试创建一个简单的报告,该报告将给我昨天所有的保留。

例如

    Select playerid, datereservationmade 
    from dbo.lms

通常很简单,我会做

    Select playerid, datereservationmade 
    from dbo.lms
    where datereservationmade >= dateadd(day,datediff(day,1,GETDATE()),0)
    AND datereservationmade < dateadd(day,datediff(day,0,GETDATE()),0)

在这种情况下不起作用,因为datereservationmade字段是小数,如果它的月份是1-9,则不使用0并使其成为5位小数,如果它的10-12,则是6位小数。

请有人帮我弄清楚如何转换!

3 个答案:

答案 0 :(得分:1)

如果有可能,您确实应该修复架构,以便将日期实际存储为日期。 如果需要使用十进制数据类型,则可以使用以下内容...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
BEGIN DROP TABLE #TestData; END;

CREATE TABLE #TestData (
    decimal_date DECIMAL(6, 0) NOT NULL 
    );
INSERT #TestData (decimal_date) VALUES (101118), (90118), (101718);

--==============================================

SELECT 
    td.decimal_date,
    dd.date_date
FROM
    #TestData td
    CROSS APPLY ( VALUES (RIGHT('0' + CONVERT(VARCHAR(6), td.decimal_date), 6)) ) cd (char_date)
    CROSS APPLY ( VALUES (CONVERT(DATE, STUFF(STUFF(cd.char_date, 5, 0, '/'), 3, 0, '/'), 1)) ) dd (date_date)
WHERE 
    dd.date_date = CONVERT(DATE, DATEADD(DAY, -1, GETDATE()));

答案 1 :(得分:0)

通过在前面添加零并获得右6个字符来将小数转换为varchar(6)。

然后将字符串从其部分(即varchar(6)中的子字符串)转换为日期。在SQL Server 2012中,借助DATEFROMPARTS函数使此操作变得更加容易。

答案 2 :(得分:0)

按照Tab Alleman的建议,使用DATEFROMPARTS,您可能会得到以下信息:

-- Example of the arithmetic
SELECT 101118 / 10000 AS Month, (101118 % 10000) / 100 AS Day, (101118 % 100) AS Year
-- Using the math in DATEFROMPARTS
SELECT DATEFROMPARTS((101118 % 100) + 2000, 101118 / 10000, (101118 % 10000) / 100 )

但是,我怀疑您提供了所有正确的信息。一月一日会发生什么?您的十进制值不会以零开头(如您所说)。您的日子会永远保持零吗?如果不是,那么1119将不会产生与10119相同的结果。但是,如果您的一天确实从零开始,那么上面的等式应该可以正常工作。