如何使用DATETIME字段从昨天提取所有数据

时间:2018-11-05 14:19:44

标签: sql sql-server datetime

我需要使用日期/时间字段专门从昨天提取数据。我不断出错。我不确定自己在做什么错。

我需要的是带有CustomerPurchaseDateTime和昨天日期的所有行。

这是我的WHERE语句:

示例:

AND CAST(v.CustomerPurchaseDateTime AS DATE) >= DATEADD(DAY, -1,
CONVERT(v.CustomerPurchaseDateTime,GETDATE())) 

例如错误信息4104,第16级,州1,第45行 无法绑定多部分标识符“ v.AdmitDtm”。 讯息243,第16级,州1,第45行 v.AdmitDtm类型不是已定义的系统类型。

注意:我没有您使用发布的示例。我刚刚发布它以提供我所处位置的一些背景信息。

4 个答案:

答案 0 :(得分:2)

您使用的CONVERT错误。但是,假设CustomerPurchaseDateTime是日期时间,您可以简单地执行以下操作:

WHERE v.CustomerPurchaseDateTime >= CAST(DATEADD(DAY, -1, GETDATE()) AS DATE)

上面的2018-11-05 12:34:56上将检查日期>= 2018-11-04 00:00:00

答案 1 :(得分:2)

您必须将表明确定义为v,否则会显示错误,如下所示。

select v.* from YourTable v

这里v是表的别名。没有别名,您将无法使用v .. 您可以在日期列中使用dateadd函数来获取昨天的日期,如下所示。

select DATEADD(dd, -1, getdate())

希望这会对您有所帮助。

答案 2 :(得分:1)

首先,请看问题代码中的部分表达式:

CONVERT(v.CustomerPurchaseDateTime,GETDATE())

那没有道理。这不是如何调用convert函数。您拥有v.CustomerPurchaseDateTime的第一个参数应该是数据类型,例如datedatetime。甚至'date'之类的字符串值也不正确。然后,这会使较大的DATEADD()函数调用感到困惑,以至于我不确定Sql Server会再尝试使用它做什么,并且我怀疑当您修复错误时,最终会看到另一个错误这条线。

但是我一开始不会这样写。

请尽可能避免对表中的值调用诸如CONVERT()CAST()之类的函数。调用类似的函数会破坏该列上可能有助于查询的所有索引,从而降低数据库性能的核心。此外,您将始终需要为表中的每一行调用该函数,即使结果中不会显示的行也是如此。在这种情况下,可以避免对表中的值使用函数,如下所示:

WHERE v.CustomerPurchaseDateTime >= CAST(DATEADD(day, -1 current_timestamp) AS DATE)

或者如果您曾经在此表中记录将来的购买/预订:

WHERE v.CustomerPurchaseDateTime >= CAST(DATEADD(day, -1 current_timestamp) AS DATE) 
  AND v.CustomerPurchaseDateTime <  CAST(current_timestamp AS DATE)

这两个函数仍然调用函数(CAST()),但是他们使用current_timestamp值(与getdate()相同,但跨平台和标准更高)来调用该函数。实际上是一个常数。我的两个选项都不需要对表中实际存储的值进行任何计算。他们只在整个查询中一次调用函数 ,而不是每行一次,并且不会干扰索引。

但是问题中发布的错误与此无关。

该错误表明存在AdmitDtm列,该列未在问题中的任何代码中显示。您应该查找该列的使用位置,并确保该区域中的语法也正确。

答案 3 :(得分:0)

CONVERT函数语法似乎是错误的。

您需要指定数据类型以首先进行如下转换:

CONVERT( datatype, expression [, style] )