【问题标题】:Is there a way to get a week old data from a table were the date field is a varchar - SQL Server 2016如果日期字段是 varchar - SQL Server 2016,有没有办法从表中获取一周前的数据
【发布时间】:2019-09-20 02:29:00
【问题描述】:

我遇到了一个错误

将 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

【问题讨论】:

  • 理想情况下,您应该修复您的数据。将日期存储为varchar 只会导致问题。 varchar 的操作与 date 非常不同。例如,在您的数据中,02.05.2017' 是该表中的“最早”“日期”。虽然,正如 Gordon 所示,您可以CONVERT 该值将对性能产生(显着)影响。
  • 获取日期()函数,你的数据类型不相等......你应该使用函数来改变数据......像转换。转换有 3 部分...

标签: sql sql-server


【解决方案1】:

或者,您可以将日期转换为所有可能的值。我真的建议您更改列的数据类型以防止出现其他问题。

/*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));

【讨论】:

    【解决方案2】:

    尝试使用带有格式说明符的convert()

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

    Here 是一个 dbfiddle,表明它适用于您的示例数据。

    如果数据中有错误的日期值,请使用try_convert()

    另外,修复数据,以便使用正确的类型存储您的值!

    编辑:

    要查找错误的日期值,请使用:

    select  USERNAME, UDATE
    from  SAP_CDHDR
    where try_convert(date, udate, 104) is null 
    

    【讨论】:

    • 此解决方案无法正常工作,出现“从字符串转换日期和/或时间时转换失败”等错误。
    • 听起来你的格式不一致@albinxavier333
    • @Gordon 感谢您的意见。正如您所说,我在日期字段中发现了一些不一致
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2011-10-27
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多