我需要使用日期/时间字段专门从昨天提取数据。我不断出错。我不确定自己在做什么错。
我需要的是带有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类型不是已定义的系统类型。
注意:我没有您使用发布的示例。我刚刚发布它以提供我所处位置的一些背景信息。
答案 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
的第一个参数应该是数据类型,例如date
或datetime
。甚至'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] )