我有一个带有事务表的SQL Server 2008数据库。有一个字段定义为NVARCHAR(16)。存储的数据的日期和时间格式如下: 2016100708593100
我需要编写一个查看该字段并在两个日期之间提取数据的查询
select ... from...where convert(varchar,
convert(datetime,left(a.xact_dati,8)),101)
between '9/29/2016' and '10/05/2016'
我尝试过其他转换但没有任何数据返回。如果我使用> = getdate() - 1 我得到数据所以我应该看到返回的东西。有什么建议吗?
答案 0 :(得分:0)
假设YMD订单
where cast(left('2016100708593100', 8) as date) between '20160929' and '20161005'
注意不满足此条款。
答案 1 :(得分:0)
用
替换WHERE子句... WHERE CONVERT(DATETIME,LEFT(a.xact_dati,8)) BETWEEN '9/29/2016' AND '10/05/2016'
答案 2 :(得分:0)
问题是你正在尝试与varchar数据进行日期比较。
您将初始值转换为日期时间,然后返回varchar。
你可以依靠Sql隐式地将之间的参数转换为datetime。
select 'matched',convert(datetime,left('2016100708593100',8),112)
where convert(datetime,left('2016100708593100',8),112) between '2016/09/29' and '2016/10/10'
答案 3 :(得分:0)
将字符串的日期部分和CAST
作为DATE
,然后将其与正确的日期格式进行比较。
select ... from...
where cast(left('2016100708593100', 8) as date) between '2016-09-29' and '2016-10-10'
答案 4 :(得分:0)
一种非常直接和快速的方法可以将其保留在BIGINT
这样的事情:
cast(left(a.xact_dati,8) as bigint) between 20160929 and 20161005
但无论如何这不会是sargable,因此不能使用索引。
您甚至可能坚持使用varchar,因为YYYYMMDD格式在字母数字排序方面是安全的。使用LEFT
剪切字符串是可以攻击的(AFAIK):
left(a.xact_dati,8) between '20160929' and '20161005'