Sql server SQL Server日期格式化问题
我有一个SQL Server 2008数据库和一个事务表。有一个字段定义为NVARCHAR(16)。存储的数据的日期和时间格式如下: 2016100708593100 我需要编写一个查询,查看该字段并在两个日期之间提取数据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' 我尝试
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,依赖于特定于文化的格式。。。我不建议这样。。。