2016-02-19 42 views
0

不使用正确类型(日期)的道歉。使用nvarchar的选择不佳,但我无法在此阶段进行转换。日期范围搜索 - 使用nvarchar的tSQL

的问题:

我希望能够在一定的日期范围来搜索数据,例如,16年1月10日 - > 16年2月19日

但是,它似乎只带回前两位数值的数据,因此无论月份和年份如何,都在10到19之间。

我的查询如下:

SELECT ID, Day, Date FROM oneHr$ 
WHERE date >= CONVERT(NVARCHAR, '10.01.16', 4) 
AND date <= CONVERT(NVARCHAR , '19.02.16', 4) 
ORDER BY Date ASC 

任何想法?非常感谢并提前致谢。

这是正在返回什么:

ID Day Date 
-------------------- 
943 fri 10.02.15 
746 mon 10.02.16 
234 tue 10.03.15 
835 fri 10.04.15 
988 tue 10.05.15 
487 wed 11.01.16 
343 wed 11.02.15 
874 mon 12.01.16 
663 thu 12.01.15 
198 tue 12.02.15 
775 wed 13.01.16 
993 thu 14.01.15 
375 fri 15.03.15 
337 wed 16.12.15 
784 tue 17.11.15 
777 mon 18.08.15 
252 thu 19.01.16 
664 wed 19.02.15 

UPDATE

所以,我已经改变了日期是datetime类型和所有看起来很不错。但是,我试图定义一个范围而不是硬编码,它不起作用。有任何想法吗?

set @date1 = '2016-01-01 00:00:00' -- Date1 (start range) 
set @date2 = '2016-01-10 00:00:00' -- Date2 (end range) 

/* Not Working */ 
select * from oneHr$ 
where Date >= @date1 
and Date <= @date2 
order by ID 

/* Working */ 
select * from oneHr$ 
where Date >= '2016-01-01 00:00:00' 
and Date <= '2016-01-10 00:00:00' 
order by ID 
+0

已解决!现在已经很晚了,我没有正确整理我的tSQL脚本。因此,转换为日期时间,一切正常。 – scg

回答

1

为什么不做这样的事情?

SELECT ID, Day, Date FROM oneHr$ 
WHERE CONVERT(DATE, date, 4) >= @Date1 
AND CONVERT(DATE, date, 4) <= @Date2 
ORDER BY Date ASC 

然后,您将不必将输入转换为nvarchar。

+0

JUST因此OP很清楚,他为什么不工作的原因是nvarchar使用字符串排序来排序,因此也用于查询类型之间。因此,在一个字符串中,'11.01.05'介于'10.01.16'和'19.02.16'之间。这是没有改变模式的解决方案,但如果这是一个大型表格,将会在性能方面非常昂贵。您是否可以通过插入或更新当前列的触发器添加一列转换为实际日期的列? – HLGEM

+0

谢谢。所以我尝试了上面提出的查询,我得到以下错误 - “消息241,级别16,状态1,行2098 转换日期和/或时间从字符串转换失败。” – scg

+0

日期类型为nvarchar。我想我将不得不探索将模式更改为正确的类型。我没有那么多的数据(截至目前),但在一两年内会超过+ 1M行。 – scg