为什么我会收到日期转换错误?

时间:2014-01-03 08:15:13

标签: sql sql-server-2008 tsql

我有一个包含3列的表格:

  • PNum varchar(12)(格式为YYYYMMDDNNNN的人生日)
  • DFrom varchar(8)(格式为YYYYMMDD的开始日期)
  • DEnd varchar(8)(格式为YYYYMMDD的结束日期)

我尝试执行以下代码:

SELECT DISTINCT 
    d.PNum, d.DEnd, d.DFrom 
FROM d
WHERE 
    (d.PNum LIKE '1995%' AND (d.DFrom <= DATEADD(day,14,GETDATE()))
ORDER BY 
    d.PNum

我得到了:

  

将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

如果我将条件改为

WHERE (d.PNum LIKE '199%' AND (d.DFrom <= DATEADD(day,14,GETDATE()))

我,用199开头检索所有PNum,我将得到结果,包括那些从1995年开始的PNum记录。

根据我使用的内容,我将检索记录或日期转换错误。例如:

d.PNum LIKE '199507%' ...

会工作(有几条记录)..但是

d.PNum LIKE '199512%' 

不起作用(有几条记录)。

注意,只有在我合并这两个条件时才会出现错误。如果我删除(d.DFrom)部分,它将正常工作。而且,如果我使用199%,我将获得所有记录,包括那些在缩小过滤器时无法获得的记录。

所以在我看来,SQL Server会根据PNum过滤器以某种方式解释日期?但为什么?

感谢您提供的任何见解!

/ Fridden

2 个答案:

答案 0 :(得分:3)

  1. 始终使用正确的DATETIME数据类型来存储日期和时间
  2. 在比较之前,您需要CAST到DATETIME。
  3. 试试这个

    SELECT DISTINCT d.PNum,d.DEnd,d.DFrom FROM d
    WHERE d.PNum LIKE '1995%' 
          AND (cast(d.DFrom as datetime) <= DATEADD(day,14,GETDATE())
    ORDER BY d.PNum
    

答案 1 :(得分:2)

尝试更改数据类型 -

DECLARE @temp TABLE(
    PNum DATETIME,
    DFrom DATE,
    DEnd DATE
)

INSERT INTO @temp (PNum, DFrom, DEnd)
VALUES ('20130112 12:30', '20130112', '20130112');

SELECT DISTINCT PNum, DEnd, DFrom 
FROM @temp
WHERE YEAR(PNum) = 2013 AND DFrom <= DATEADD(DAY, 14, GETDATE())
ORDER BY PNum