Функция LEFT в SQL Server не возвращает результатов - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь поместить данные, соответствующие определенному месяцу, во временную таблицу из базы данных SQL.

DROP TABLE
    #ComPAIR_Alliance_Table
SELECT
    IMOno
    ,period
    ,[service]
    ,alliances
INTO
    #ComPAIR_Alliance_Table
FROM
    com_COMPAIR.dbo.Data_BlueWaterCapacity_US_2
WHERE
    LEFT(period, 7) = '2015-03'

SELECT
     *
FROM #ComPAIR_Alliance_Table

Поле периода имеет следующий формат: 2015-03-29 00:00:00.000

Однако мой код просто возвращает пустую временную таблицу с правильными именами столбцов, но без строк (даже если я знаю,наверняка строки с этой датой существуют в моей таблице).Я уже убедился, что столбец периода действительно является строкой, используя is.numeric.

Может кто-нибудь помочь мне разобраться в чем может быть проблема?

Спасибо!

Ответы [ 5 ]

0 голосов
/ 22 февраля 2019

Функция LEFT должна неявно преобразовывать ваш столбец datetime в значение varchar, чтобы выполнить свою работу.SQL Server выбирает формат даты varchar на основе своих настроек интернационализации.На моем сервере его Mar 29 2015 12:00AM и LEFT дают Mar 29.Вот почему он не равен 2015-03.

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

WHERE period BETWEEN '1/1/2015' AND '1/31/2015'

0 голосов
/ 21 февраля 2019

LEFT делает некоторые странные вещи, потому что LEFT вызывает неявное приведение к String с даты .Вы можете увидеть этот вопрос для получения дополнительной информации, но вы получаете именно то, что вы сказали SQL - соединение в строках, где оставшиеся 7 символов периода равны '2015-03', что не произойдет,так как вам нравится сравнивать с чем-то вроде 'Jan 01'

0 голосов
/ 21 февраля 2019

Если это дата / дата / время / дата2, то вы можете сравнить его с 2015-03, например:

WHERE period >= '2015-03-01'
AND   preiod <  DATEADD(MONTH, 1, '2015-03-01')

В случае путаницы:

  • Выше будетсовпадать со всеми датами марта 2015 года, такими как 2015-03-31, 2015-03-31 23:59:59 и 2015-03-31 23:59:59.9999999
  • Вышеприведенное можно понять: часть DATEADD не зависит от строк таблицы
0 голосов
/ 21 февраля 2019

Гадание Period - это date.Если это так, перестаньте относиться к нему как к varchar, это не так.Если вы хотите получить значения с марта 2015 года, выполните:

WHERE period >= '20150301'
  AND period < '20150401'
0 голосов
/ 21 февраля 2019

дата сохраняется как тип даты.Вы можете попробовать

where convert(varchar(20), period,121) 

, который конвертирует его в строку ...

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