代码之家  ›  专栏  ›  技术社区  ›  ProgSky

SQL Server比较日期时间和字符

  •  0
  • ProgSky  · 技术社区  · 6 年前

    我正在查看一个遗留系统,其中有一个“日期”列 report_date 在桌子上 t_results 设置为char(25)。

    列的名称为report\u date,类型为 report_date (char(25),null)

    存储过程将表用作

    ALTER PROCEDURE [dbo].[s_report]
    (
        @report_date_from DATETIME,
        @report_date_to DATETIME,
    )
    AS
    
    SET NOCOUNT ON
    
    SELECT * 
    FROM 
        t_results
    WHERE
        report_date >= @report_date_from AND report_date <= @report_date_to
    ORDER BY report_id
    

    当我把它当作 EXEC s_report '9/4/2018','10/2/2018' 运行良好,达到了预期效果。

    SELECT * 
    FROM 
        t_results
    WHERE
        report_date >= '09/04/2018' AND report_date <= '10/2/2018'
    

    我不知道这场狂欢是怎么进行的。关于如何在where子句中比较char和datetime,有什么想法或建议吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Cetin Basoz    6 年前

    存储过程正在转换为DateTime。当其中一种类型不同时,SQL Server在进行检查时会执行隐式转换,因此SP代码隐式类似于:

    where cast(report_date as datetime) >= '09/04/2018' and cast(report_date as datetime) <= '10/2/2018'
    

    注意:传递这样的日期字符串是不安全的,并且依赖于服务器设置。“20180904”和“20181002”等通行证。

        2
  •  2
  •   SQL_M    6 年前

    我认为你的程序基本上是这样的:

    SELECT * 
    FROM t_results
    WHERE report_date >= CAST ('09/04/2018' AS DATETIME) 
      AND report_date <= CAST ('10/2/2018' AS DATETIME)