Получение данных после определенной даты и часа, но дата и час находятся в разных столбцах в SQL Server

У меня возникли проблемы с получением данных после даты и часа разделителя в этой таблице с именем Test:

Столбцы и примеры данных:

идентификатор Дата Час 1 20091220 23:10:23 2 20201020 10:10:25 3 20101020 15:10:27

Я пробовал следующее:

SELECT *
FROM test
WHERE Date > 20090101
  AND Hour > '15:22:33'

и:

SELECT a.id
FROM
    (SELECT * FROM test 
     WHERE Date >= 20090101) AS a
WHERE a.Hour>= '15:22:33'

Однако оба запроса вернули этот результат:

идентификатор Дата Час 1 20091220 23:10:23

когда ожидаемым результатом были все строки, так как все данные после 01.01.2009. Я понимаю, что проблема заключается в разделителе часов, однако я не могу обойти это.

В настоящее время я использую SQL Server Management Studio v18.

Лучший ответ - преобразовать «дату» и «час» в дату и время, а затем добавить их вместе.

SteveC 22.12.2020 16:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, лучше хранить дату и время в одном столбце. Но я думаю, что логика, которую вы хотите, такова:

SELECT *
FROM test
WHERE Date > 20090102 OR
      (Date = 20090102 AND Hour > '15:22:33')

Это возвращает все строки, в которых дата находится после 20090102 15:22:343.

Или, вы можете сформулировать это как:

WHERE CONVERT(datetime, CONCAT(date, ' ', hour)) > '2009-01-02 15:22:33'

Эта версия фактически предлагает модификацию таблицы с использованием вычисляемого столбца:

alter table test add column date_hour as
    ( CONVERT(datetime, CONCAT(date, ' ', hour)) );

Затем вы можете написать:

where date_hour > '2009-01-02 15:22:33'

И вы можете создать индекс в столбце date_hour, чтобы повысить производительность.

В зависимости от языка это может быть проблемой. yyyy-MM-dd hh:mm:ss не является однозначным (для типа данных datetime). На самом деле, если вы не американец, дата будет читаться как yyyy-dd-MM hh:mm:ss. Например, если вы англичанин (который, по словам Microsoft, не говорит по-английски???), приведенное выше будет ошибкой (если мы проигнорируем тот факт, что синтаксис на самом деле ADD не ADD COLUMN). дб<>рабочий пример

Thom A 22.12.2020 15:58

Это сработало! Спасибо!! Я понимаю, что было бы лучше хранить их в одном столбце, но эти данные поступают из ERP, и я мало что могу с этим поделать. Спасибо за подсказку!

thiagopleasehelp 22.12.2020 15:58

столбец «Дата» - это не дата и время, а целое число, поэтому оно работает, когда мы используем ГГГГММДД, как предложил Гордон, поскольку наиболее значимое значение находится слева, немного беспорядочно, но я ничего не могу сделать, так как это ERP клиента

thiagopleasehelp 22.12.2020 16:02

Тогда вам действительно нужно исправить дизайн. int — это не дата, @thiagopleasehelp, а date — это не число. Столбец, определенный как date int, не имеет смысла; это по определению не свидание...

Thom A 22.12.2020 16:02

Как я уже сказал, это из базы данных клиента (на самом деле это очень крупная компания из Бразилии), я только разрабатываю для них вещи как терсеризованный сотрудник, вещи, которые вы найдете в бразильских базах данных, всегда вас удивят (в хорошем или плохом смысле). хахаха), для них, пока это работает, все в порядке. Но я согласен с вами

thiagopleasehelp 22.12.2020 16:06

Другие вопросы по теме