Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server日期格式化问题_Sql Server - Fatal编程技术网

Sql server SQL Server日期格式化问题

Sql server SQL Server日期格式化问题,sql-server,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' 我尝试

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

假设YMD订单刚刚好

where cast(left('2016100708593100', 8) as date) between '20160929' and '20161005'

注:本条款不满足。

假设YMD订单仅为

where cast(left('2016100708593100', 8) as date) between '20160929' and '20161005'

注:不满足此条款。

将WHERE条款替换为

... WHERE CONVERT(DATETIME,LEFT(a.xact_dati,8)) BETWEEN '9/29/2016' AND '10/05/2016'

将WHERE子句替换为

... WHERE CONVERT(DATETIME,LEFT(a.xact_dati,8)) BETWEEN '9/29/2016' AND '10/05/2016'

问题是您正在尝试使用varchar数据进行日期比较

将初始值转换为datetime的过程进行了一半,然后又返回到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'

问题是您正在尝试使用varchar数据进行日期比较

将初始值转换为datetime的过程进行了一半,然后又返回到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'

取字符串的日期部分,并将其转换为日期,然后将其与正确的日期格式进行比较

select ... from... 
where cast(left('2016100708593100', 8) as date)  between '2016-09-29' and '2016-10-10'

取字符串的日期部分,并将其转换为日期,然后将其与正确的日期格式进行比较

select ... from... 
where cast(left('2016100708593100', 8) as date)  between '2016-09-29' and '2016-10-10'

一种非常直接快速的方法是将其保存在
BIGINT

大概是这样的:

  cast(left(a.xact_dati,8) as bigint) between 20160929 and 20161005
但无论如何,这将不是可搜索的,因此不能使用索引

您甚至可以坚持使用varchar,因为YYYYMMDD格式对于字母数字排序是安全的。用
剪切字符串是可搜索的(AFAIK):


一种非常直接快速的方法是将其保存在
BIGINT

大概是这样的:

  cast(left(a.xact_dati,8) as bigint) between 20160929 and 20161005
但无论如何,这将不是可搜索的,因此不能使用索引

您甚至可以坚持使用varchar,因为YYYYMMDD格式对于字母数字排序是安全的。用
剪切字符串是可搜索的(AFAIK):


为什么要将时间戳存储为
NVARCHAR
?这是一个非常糟糕的决定尝试转换格式112而不是101它是一个供应商数据库,所以我对数据的存储方式没有发言权。我尝试了112,但它也没有返回任何数据。2016年7月10日只是表中的最大日期。表示为“2016年9月29日至2016年5月10日”的日期可能有问题,请使用ISO“YYMMDD”格式,例如“20161005”为什么将时间戳存储为
NVARCHAR
?这是一个非常糟糕的决定尝试转换格式112而不是101它是一个供应商数据库,所以我对数据的存储方式没有发言权。我尝试了112它也没有返回任何数据。2016年7月10日只是表中的最大日期。表示为“2016年9月29日”和“2016年5月10日”的日期可能有问题,请使用ISO“YYYMMDD”格式,例如“20161005”这是不可销售的,并且依赖于特定于区域性的格式。。。我不建议这样做…这不是sargable,依赖于特定于文化的格式。。。我不建议这样。。。