我需要按天(24小时)从SQL Server数据库中获取所有值。我在TestAllData
表中有“时间戳记”列,我想选择仅对应于特定日期的数据。
例如,有DateTime
类型的时间戳,例如'2019-03-19 12:26:03.002', '2019-03-19 17:31:09.024'
和'2019-04-10 14:45:12.015'
,因此我想分别加载日期2019-03-19
和日期{{ 1}}。基本上,需要获取具有相同日期的DateTime值。
是否可以使用某些功能,例如2019-04-10
或DatePart
?
我该如何整体解决此类问题?
在这种情况下,我不知道时间戳与一天结束之间的小时数的确切差异(因为1天有各种时间戳),因此我需要从时间戳中提取日期本身。之后,我需要按天或类似的方式对数据进行分组,然后逐块获取。例如:
'2019-03-19'-1200条 '2019-04-10'-3500条记录 '2019-05-12'-10000条记录等等
我正在寻找一种不提供时间戳(例如'2019-03-19')作为边界或where子句的更通用的解决方案,因为问题不仅仅在于按日期过滤数据!!
更新:在我的数据集中,我有大约1,000,000条记录和100多个唯一日期。我正在考虑提取一组唯一的日期,然后在循环中运行查询,该循环将按提供的日期对数据进行过滤。它看起来像这样:
DateDiff
我可能会在代码中使用此查询,因此我可能会在Scala函数的循环中运行它。但是,我不确定在性能方面是否可以运行单独的唯一日期提取查询。
答案 0 :(得分:0)
取决于是否要处理所有日期(而不只是子集),实现此目的最简单的方法之一是强制转换:
;with cte as (SELECT cast(my_datetime as date) as my_date, * from TestAllData)
SELECT * FROM cte where my_date = '2019-02-14'
请注意,在将datetime转换为date时,时间将被截断,即仅提取日期部分。
正如我所说,这是否有效取决于您的需求,因为所有记录中的所有datetime值都将在过滤数据之前转换为最新日期。但是,如果要选择多个日期(而不是一个或两个),则可能会更快,因为它会读取整个表一次,然后为您提供一列,您可以在该列上进行更有效的过滤。
但是,如果这是一个永久性的要求,我可能会使用一个持久化的计算列,这实际上意味着该转换最初会进行一次,然后在相应值更改时才进行。对于大表,我也强烈考虑在计算列上建立索引。