我有一个包含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
答案 0 :(得分: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