我有一列以小数形式显示日期,例如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位小数。
请有人帮我弄清楚如何转换!
答案 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相同的结果。但是,如果您的一天确实从零开始,那么上面的等式应该可以正常工作。