Использование даты типа char в предложении where - PullRequest
1 голос
/ 28 октября 2010

У меня есть таблица базы данных SQL Server со столбцом char с именем «DATE» (я знаю, очень плохо, но я не создал базу данных), в котором даты хранятся в этом формате в виде строк: YYMMDD. Мне нужно возвращать записи между этими датами, поэтому относитесь к ним как к фактическим датам, и я пробовал каждую комбинацию, которую я знаю, но все равно получаю ошибки. Буду признателен за любую оказанную помощь. Я попробовал все это без удачи:

SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 112) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 12) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 112) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 12) AS datetime) BETWEEN '100401' AND '101001'
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 112) AS datetime) >= 100401 AND CAST(CONVERT(char(8), [DATE], 112) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), [DATE], 12) AS datetime) >= 100401 AND CAST(CONVERT(char(8), [DATE], 12) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 112) AS datetime) >= 100401 AND CAST(CONVERT(char(8), "DATE", 112) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST(CONVERT(char(8), "DATE", 12) AS datetime) >= 100401 AND CAST(CONVERT(char(8), "DATE", 12) AS datetime) <= 101001
SELECT * FROM caddb..INCIDENT WHERE CAST([DATE] AS INT) >= 100401 AND CAST([DATE] AS INT) < 101001
SELECT * FROM caddb..INCIDENT WHERE CAST("DATE" AS INT) >= 100401 AND CAST("DATE" AS INT) < 101001
SELECT * FROM caddb..INCIDENT WHERE CAST([DATE] AS INT) BETWEEN 100401 AND 101001
SELECT * FROM caddb..INCIDENT WHERE CAST("DATE" AS INT) BETWEEN 100401 AND 101001

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Несколько вещей здесь:

  • Вы выбираете между CAST и CONVERT, но не оба
  • В вашем случае, CONVERT больше подходит, потому что вы можете указать точный формат (12). Используйте 12, если строка не имеет века, например 101231, и 112, если строка имеет столетие, например 20101231
  • При использовании CONVERT вы указываете нужный тип данных, а не тип данных оригинальной переменной
  • MS SQL может распознавать строковый литерал как дату и время, если вы вводите строковый литерал, например, '2010-10-28' гггг-ММ-дд

Итак, вы можете сделать что-то вроде

convert(datetime, [DATE], 12) between '2010-10-01' and '2010-10-10'
0 голосов
/ 28 октября 2010

Дайте это попробовать.Необходимо преобразовать все поля и константы в тип данных DATETIME.

SELECT * 
FROM caddb..INCIDENT 
WHERE CONVERT(datetime, "DATE", 112) BETWEEN CONVERT(datetime, '100401', 112) and CONVERT(datetime, '101001', 112)
...