两个日期之间的SQL没有返回正确的结果

时间:2016-10-24 19:50:41

标签: sql sql-server tsql

我正在使用下面的查询,我希望得到“[最后更新日期]”在2015年或2016年的行。

SELECT [NPI]
      ,[Entity Type Code]
      ,[Replacement NPI]
      ,[Employer Identification Number (EIN)]
      ,[Provider Organization Name (Legal Business Name)]
      ,[Provider Last Name (Legal Name)]
      ,[Provider First Name]
      ,[Provider Middle Name]
      ,[Provider Name Prefix Text]
      ,[Provider Name Suffix Text]
      ,[Provider Credential Text]
      ,[Provider Enumeration Date]
      ,[Last Update Date]
      ,[Healthcare Provider Taxonomy Code_1]

  FROM [Database].[dbo].[NPIInfo]
  WHERE[Healthcare Provider Taxonomy Code_1] in ('122300000X', '1223G0001X','1223P0221X','1223P0700X')
  AND ([Last Update Date] BETWEEN '2015/01/01' AND '2016/12/31' )
  order by [Last Update Date]

运行上面的代码时,我没有收到任何结果。但如果我用这个“AND”语句运行它,我会得到结果:

AND [Last Update Date] like '%2015%' or [Last Update Date] like '%2016%' 

这个结果给了我500,000 +行。

如果我每年以这种方式运行它会减少结果:

AND [Last Update Date] like '%2015%'

知道我在这里做错了吗?最后2条和陈述给了我不同的结果TIA

2 个答案:

答案 0 :(得分:3)

尝试

 WHERE CONVERT(DATETIME, [Last Update Date] , 103) BETWEEN '2015/01/01' AND '2016/12/31'

检查此页面以了解不同的格式

http://www.sql-server-helper.com/sql-server-2008/sql-server-2008-date-format.aspx

答案 1 :(得分:2)

编辑:显然我错了。留下答案以供参考问题。但是,CAST代码可能仍然有用。

首先,您不能将BETWEEN与文本数据一起使用,您必须使用日期时间或数字格式。如果[Last update Date]是文字,您需要将其转换为日期时间,然后才能对其执行任何操作。最好是改变你的实际数据格式,但如果由于某种原因你不能这样做可能会有效:

AND (CAST([Last Update Date] as datetime) 
BETWEEN CAST('2015/01/01' as datetime) AND CAST('2016/12/31' as datetime))

关于like '%2015%'语句,您使用的通配符条件专门用于文本数据;这就是它起作用的原因。不同的行数是因为第一个like正在寻找 2015和2016年,而第二个正在寻找 2015。