Как вытащить все данные со вчерашнего дня с помощью поля DATETIME - PullRequest
0 голосов
/ 05 ноября 2018

Мне нужно получить данные специально со вчерашнего дня с полем даты / времени. Я продолжаю получать ошибки. Я не уверен, что делаю не так.

Мне нужны все строки с 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 голосов
/ 05 ноября 2018

Прежде всего, посмотрите на это частичное выражение из кода в вопросе:

CONVERT(v.CustomerPurchaseDateTime,GETDATE())

Это не имеет смысла. Это не то, как вызывать функцию преобразования. Первый аргумент, где у вас есть 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, который не показан ни в одном коде в вопросе. Вы должны посмотреть, где используется этот столбец, и убедиться, что синтаксис в этой области также правильный.

0 голосов
/ 05 ноября 2018

Синтаксис функции CONVERT кажется неправильным.

Вам необходимо указать тип данных для преобразования, как показано ниже:

CONVERT( datatype, expression [, style] )
0 голосов
/ 05 ноября 2018

Вы должны явно определить таблицу как v, иначе она выдаст ошибку, как показано ниже.

select v.* from YourTable v

Здесь v - псевдоним для таблицы. Без псевдонима вы не можете использовать V .. Вы можете использовать функцию dateadd в столбце даты, чтобы получить вчерашнюю дату, как показано ниже.

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

Надеюсь, это поможет вам.

0 голосов
/ 05 ноября 2018

Вы используете CONVERT неправильно. Но если предположить, что CustomerPurchaseDateTime является датой-временем, вы можете просто сделать это:

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

Вкл. 2018-11-05 12:34:56 Вышеуказанные даты будут проверены >= 2018-11-04 00:00:00

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...