SQL Server日期格式问题

时间:2016-10-07 13:06:43

标签: sql-server

我有一个带有事务表的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 我得到数据所以我应该看到返回的东西。有什么建议吗?

5 个答案:

答案 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'