Есть ли способ получить недельные данные из таблицы, где поле даты является varchar - SQL Server 2016 - PullRequest
3 голосов
/ 01 мая 2019

Я получаю сообщение об ошибке

Преобразование типа данных varchar в тип данных datetime привело к значению вне диапазона

, когда япопытайтесь получить недельные данные из таблицы в SQL Server 2016.

Столбец даты в моей таблице имеет тип данных varchar.Поэтому в своем запросе я сначала пытаюсь преобразовать его в datetime и получить результат за 1 неделю.

SELECT
    USERNAME, UDATE 
FROM
    SAP_CDHDR 
WHERE
    CAST(UDATE AS DATETIME) >= DATEADD(day, -7, CAST(GETDATE() AS DATE))

Пример ввода:

USERNAME     UDATE
--------------------------
User 1       26.07.2017
User 2       02.05.2017
User 3       08.12.2017
User 4       15.07.2016
User 5       20.10.2016

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Попробуйте использовать convert() со спецификатором формата:

select  USERNAME, UDATE
from  SAP_CDHDR
where convert(date, udate, 104) >= DATEADD(day, -7, cast(GETDATE() as date))

Здесь - это скрипта db <>, показывающая, что она работает для ваших образцов данных.

Если в данных содержатся неверные значения даты, используйте try_convert().

Кроме того, исправьте данные так, чтобы ваши значения сохранялись с использованием правильного типа!

РЕДАКТИРОВАТЬ:

Чтобы найти неверные значения даты, используйте:

select  USERNAME, UDATE
from  SAP_CDHDR
where try_convert(date, udate, 104) is null 
0 голосов
/ 01 мая 2019

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

/*This is to create sample data*/
WITH SAP_CDHDR(USERNAME, UDATE) AS(
    SELECT *
    FROM (VALUES('User 1', '26.04.2019'),
            ('User 2', '02.05.2017'),
            ('User 3', '08.12.2017'),
            ('User 4', '15.07.2016'),
            ('User 5', '20.10.2016'))SAP_CDHDR(USERNAME, UDATE)
)
/*solution begins here*/
SELECT  USERNAME, UDATE 
FROM  SAP_CDHDR
WHERE UDATE IN( SELECT CONVERT(char(10), GETDATE()-n, 104)
                 FROM(VALUES(1),(2),(3),(4),(5),(6),(7))x(n));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...