2009-12-07 82 views
2

使用SQL Server 2005结合日期和时间列问题

Date Time 

20060701 090000 
20060702 020000 
20060703 180000 
... 

日期和时间数据类型为varchar

试图查询

select Convert(datetime, Convert(char(10), date, 103) + ' ' + Convert(char(8), time, 108), 103) from table 
SELECT 
CAST(
     DATEADD(dd, 0, DATEDIFF(dd, 0, date)) + ' ' + 
     DATEADD(Day, -DATEDIFF(Day, 0, time), time)     
as datetime) from table 

它显示为超出范围值的误差。

如何解决这个问题。

需要SQL查询帮助

回答

2

首先,你为什么要存储在VARCHAR一个DATETIME?

这应该能够帮助

DECLARE @Table TABLE(
     Val VARCHAR(20) 
) 

INSERT INTO @Table (Val) SELECT '20060701 090102' 
INSERT INTO @Table (Val) SELECT '20060702 020000' 
INSERT INTO @Table (Val) SELECT '20060703 180000' 

SELECT *, 
     CAST(SUBSTRING(Val,1,8) + ' ' + SUBSTRING(Val,10,2) + ':' + SUBSTRING(Val,12,2) + ':' + SUBSTRING(Val,14,2) AS DATETIME) 

FROM @Table 
2

我遇到了类似的问题,几年前来到,进口HL7消息时。这是我使用的功能的副本。它会创建一个DateTime字符串,并将时间组件正确分隔为hh:mm:ss,这对于转换为DateTime需要。

CREATE FUNCTION fn_StringDateTietoDateTime 
(
    @Date varchar(15) 
) 
RETURNS datetime 
AS 
BEGIN 
    DECLARE @Result DATETIME 

    SET @Result = NULL 

    If len(@Date) > 0 
    BEGIN 
     SELECT @Result = CAST(SUBSTRING(@hl7date, 1, 8) + ' ' + SUBSTRING(@hl7date, 10, 2) + ':' + 
      SUBSTRING(@date, 12, 2) + ':' + SUBSTRING(@date,14, 2) AS DATETIME) 
    END 

    RETURN @RESULT 
END