Ошибка преобразования при преобразовании значения varchar '2019-05-13 23:45:00' в тип данных int - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь получить результаты теста (один из столбцов) за определенный день из БД SQL Server. Поле даты по умолчанию отображается в формате UnixTimeStamp, поэтому я использовал функцию DateAdd с Cast для отображения ее в формате дневного времени. Но теперь, если я пытаюсь отфильтровать результаты только для определенного дня, я получаю ошибку как

Преобразование не удалось при преобразовании значения varchar '2019-05-13 23:45:00 к типу данных int.

Похоже, приведение, которое я сделал к Unixtimestamp, дает значение Varchar, которое я не могу использовать для сравнения как целое число. Но я не могу заставить этот рабочий порядок сравнивать поле даты. Любое решение будет с благодарностью.

Ниже мой запрос:

DECLARE @LocalTimeOffset BIGINT
SET @LocalTimeOffset = DATEDIFF(SECOND, GETDATE(), GETUTCDATE())


SELECT 
    DATEADD(SECOND, F_DATE - @LocalTimeOffset, CAST('1970-01-01 00:00:00' AS datetime)) as F_DATE, 
      ,[F_PART]
      ,[F_PRCS]
      ,[F_TEST]
      ,[F_VALUE]
FROM
    Table1
WHERE 
    F_DATE> '2019-05-14 23:45:00' AND F_DATE< '2019-05-16 00:00:00'

Результаты обычно отображаются, как показано ниже, если я не пытаюсь фильтровать по дате:

F_Date               F_PART         F_PRCS         F_TEST      F_Value
14-01-2016 08:23:00   1442418652    1442413364   1442329164        0
14-01-2016 08:58:00   1442418652    1442413315   1442329228        0
14-01-2016 09:26:00   1442418687    1442413586   1443628344        2
14-01-2016 09:26:00   1442418705    1442413778   1451906136        0
14-01-2016 09:27:00   1442418687    1442413586   1442329173        0
14-01-2016 09:27:00   1442418687    1442413586   1442329224        0
14-01-2016 10:04:00   1442418687    1442413586   1442329232        0
15-01-2016 04:09:00   1442418687    1442413578   1443814431        0
16-01-2016 04:09:00   1442418687    1442413578   1443814483        0
17-01-2016 04:09:00   1442418687    1442413578   1443814521        0
18-01-2016 04:09:00   1442418687    1442413578   1451906136        0
19-01-2016 04:09:00   1442418687    1442413578   1443814800        0

Я хочу отфильтровать результаты только за определенный день Например, для 15-01-2016 я хочу следующий результат.

F_Date                  F_PART        F_PRCS          F_TEST        F_Value
15-01-2016 04:09:00    1442418687    1442413578       1443814431    0

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Во-первых, в SQL Server нет типа BIGINTSET, возможно, вы имеете в виду BIGINT, и вам не нужно указывать имя переменной @LocalTimeOffset дважды.

DECLARE @LocalTimeOffset BIGINT = DATEDIFF(second,GETDATE(),GETUTCDATE());

Длязапрос, там много проблем, сначала вы не можете использовать псевдоним столбца в предложении WHERE, если вы не используете его в CTE / SubQuery, затем вы можете обратиться к нему по псевдониму.

Во-вторых, вы передаете литеральную строку, преобразуете ее в DATE, затем добавляете количество секунд, хранящееся в переменной @LocalTimeOffset, чтобы значение F_DATE было одинаковым длявсе строки, что делает фильтр в предложении WHERE бессмысленным.

Кроме того, часть DATEADD(second,F_DATE@LocalTimeOffset, не соответствует действительности и выдаст ошибку, что означает, что ваш запрос не возвращаетсяпредоставленные вами данные.

Неверное имя столбца'F_DATE@LocalTimeOffset'.

Если мы просто попытаемся исправить предоставленный вами запрос, он будет таким же, как

DECLARE @LocalTimeOffset BIGINT = DATEDIFF(second,GETDATE(),GETUTCDATE());

SELECT DATEADD(second, @LocalTimeOffset, CAST('1970-01-01 00:00:00' AS datetime)) as F_DATE
FROM master..[spt_values];

Итак, что вы пытаетесь отфильтровать здесь, поскольку у вас одинаковое значение в F_DATEстолбец во всех строках?


После того, как вы разместите комментарий и обновления, вы можете сделать как

;WITH CTE AS
(
SELECT 
    DATEADD(SECOND, F_DATE - @LocalTimeOffset, CAST('1970-01-01 00:00:00' AS datetime)) as F_DATE, 
      ,[F_PART]
      ,[F_PRCS]
      ,[F_TEST]
      ,[F_VALUE]
FROM
    Table1
)
SELECT *
FROM CTE
WHERE F_DATE > '2019-05-14 23:45:00' AND F_DATE < '2019-05-16 00:00:00';
0 голосов
/ 13 июня 2019

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

Таким образом, ссылка на F_DATE в WHERE относится к столбцу в таблице, а не к преобразованному значению.

Я не уверен, что такое BIGINTSET или что такое запись @.

Мне нравится:

SELECT v.F_DATE, . . .
FROM Table1 t1 CROSS APPLY
     (VALUES (DATEADD(second, F_DATE, CAST('1970-01-01' AS datetime))
     ) v(F_DATE)
WHERE v.F_DATE > '2019-05-14 23:45:00' AND
      v.F_DATE < '2019-05-16 00:00:00';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...