2016-06-17 3 views
1

У меня есть столбец «Загружен» типа varchar (25). Он имеет значения даты и времени. Поскольку строка, хранящаяся в этом столбце, является недопустимой датой (front-end передает их. Нет контроля там), она сохраняется как varchar (25). Эти строки, хранящиеся в нем, как:SQL Server: значения поиска типа «varchar» с параметрами типа «дата»

2016: 04: 14 21:20:35
2016: 04: 14 21:20:35
2016: 04: 14 21:20:35

,
.
.

Мне нужно сравнить эти значения в поисковом запросе

Select * from Table where [Uploaded] BETWEEN @StartDate AND @EndDate 

@StartDate и @EndDate являются переменными типа дата. Очевидно, что указанный выше запрос не будет работать. Итак, у меня есть 2 способа: 1. Напишите правильный запрос, который может сравнивать переменные прошедшего типа даты с столбцом «Загруженный». 2. Обновите значения столбца [Загружено] и сохраните их как допустимый тип даты и времени.

Как это можно достичь? Может ли кто-нибудь помочь мне написать либо правильный поисковый запрос, либо обновить все записи, чтобы преобразовать их в действительный тип datetime?

ответ

0

Если вы получили : между год, месяц и день в [Uploaded] поле, то используйте:

SELECT * 
FROM Table 
WHERE CAST(REPLACE(LEFT([Uploaded],10),':','-') as date) BETWEEN @StartDate AND @EndDate 

Если datetime нужен тогда:

SELECT * 
FROM Table 
WHERE CAST(REPLACE(LEFT([Uploaded],10),':','-') + RIGHT([Uploaded],9) as datetime) BETWEEN @StartDate AND @EndDate 
+0

В этом заявлении он не будет сравнивать время. –

+0

От вопроса OP: * @ StartDate и @EndDate являются ** date ** переменными типа * – gofr1

-1

можно привести строку данных в значение даты и времени, а затем использовать DateTime сравнения

Select * from Table where CAST([Uploaded] as Date) BETWEEN @StartDate AND @EndDate 

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

вот еще информация: https://msdn.microsoft.com/en-us/library/ms187819.aspx

+0

SELECT CAST ('2016: 04: 14 21:20:35' AS DATE) AS [SampleDate] не работает. Вышеуказанный запрос также не выполняется. Ошибка конверсии при преобразовании даты и/или времени из символьной строки. – user1640256

+0

Это даст ошибку преобразования. Ошибка конверсии при преобразовании даты и/или времени из символьной строки. –

0

Это даст вам точный результат.

select * from Table where cast(replace(left([Upholded],10),':','-')+right([Upholded],len([Upholded]-10) as datetime) between @StartDate AND @EndDate 
+0

Ошибка преобразования при преобразовании значения varchar '2016: 04: 14 21:20:35' в тип данных int. – user1640256

Смежные вопросы