微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较保存为varchar的Date和DateTime

如何解决比较保存为varchar的Date和DateTime

我有一个表,其中的列jsonStr的类型为varchar

这是此列中元素的示例

{"Date":"/Date(1602846000000)/","person":"Laura"}

我想将此日期与静态日期进行比较。这是我的查询

select * 
from mytable 
where json_value(jsonStr,'$.Date') >= '2020-10-01T00:00:00'

我希望显示一个元素,但没有结果,所以如何转换此日期以将其与DateTime进行比较

我尝试删除/ Date和/带有子字符串,然后转换/解析结果为1602846000000但没有结果

解决方法

提取的unixtime值可以通过使用

转换为日期时间格式。

DATEADD(S,CONVERT(int,LEFT(1602846000000,10)),'1970-01-01'),例如:

WITH t AS
(
SELECT *,JSON_VALUE(jsonStr,'$.Date') AS str
  FROM mytable 
),t2 AS
(
SELECT t.*,SUBSTRING(str,PATINDEX('%[0-9]%',str),PATINDEX('%[0-9][^0-9]%',str + 't') 
       - PATINDEX('%[0-9]%',str) + 1) AS nr
  FROM t
)
SELECT t2.jsonStr
  FROM t2
 WHERE DATEADD(S,LEFT(nr,'1970-01-01') >= '2020-10-01T00:00:00'

Demo

,

我会尽可能扭转这种状况。您必须为表中的每一行进行此比较的所有工作,因为在完成工作之前,我们不知道会匹配哪些行。我们对常量值(而不是所有存储的值)所做的工作越多,查询的效率就越高。

在JSON中解析日期在数据库中执行起来非常昂贵。我们无法完全摆脱这项工作,但是至少可以在将其包括在SQL中之前将初始日期字符串转换为Unix时间格式。所以这个:

'2020-10-01T00:00:00'

成为这个:

1601510400

现在,您可以执行一些更简单的字符串操作并比较数字,而无需将unix时间转换为每一行的日期值。

根据您所使用的Sql Server版本的不同,字符串操作的外观会完全不同。 Sql Server 2019添加了一些new native JSON support,这可以使此操作变得更加容易。

但是,无论哪种方式,您最好还是花一些时间来了解要存储的数据。即使保留原始json有意义,您也应该拥有一个至少在其之上支持基本元数据的架构。是否使用索引是有区别的,索引可以使性能提高多个数量级。

例如,如前所述,此问题中的查询必须提取表中每一行的日期值,甚至是不匹配的行。如果您构建一个在初始插入期间将日期标识为元数据并提取日期的架构,则索引可以使您仅查找所需的行。如果此时您仍然需要从JSON记录中提取一个值,则至少是针对相关行。

,

我使用

解决了问题
DATEADD(SECOND,CONVERT(INT,Left(SUBSTRING(JSON_VALUE(jsonStr,'$.EndDate'),7,13),'19700101'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。