比较跨列的日期拆分

时间:2010-12-30 22:43:31

标签: sql sql-server

我正在查询Microsoft SQL 2008中的表,这些表的日期分为3列:日,月和年。不幸的是,我无法控制这一点,因为数据每天都会从该格式的第三方来源进入数据库。

我需要在之间添加 where 子句,以便用户可以在一个范围内提取记录。如果日期在一个列中,但是当它分成三列时发现它几乎是不可能的,这很容易。

要显示日期,我正在做

CAST(
    CAST(year as varchar(4)) + '-' + 
    CAST(month as varchar(2)) + '-' + 
    CAST(day as varchar(2))
as date) AS "date"`  

选择中。我试图把它作为 datediff 函数的参数,或者只是之间的常规,但是没有结果。

2 个答案:

答案 0 :(得分:1)

如果无法更改表格,您可以使用子查询在应用过滤之前构建日期:

SELECT x.*
  FROM (SELECT CAST(CAST(year as varchar(4)) + '-' + 
                    CAST(month as varchar(2)) + '-' + 
                    CAST(day as varchar(2)) AS date) AS [date]
                    ...
          FROM ...) x
 WHERE x.[date] BETWEEN ? AND ?

如果使用SQL Server 2005+,您可以使用公用表表达式(CTE) - 但使用CTE与子查询方法之间没有性能差异:

WITH example AS (
   SELECT CAST(CAST(year as varchar(4)) + '-' + 
               CAST(month as varchar(2)) + '-' + 
               CAST(day as varchar(2)) AS date) AS [date]
               ...
     FROM ...) 
SELECT x.*
  FROM example x
 WHERE x.[date] BETWEEN ? AND ?

注意事项:

由于日期是在动态构建的,因此这将永远不会像将值存储为DATE或DATETIME一样好 - 无法使用年,月或日列的索引。要考虑的选项可能是indexed view (AKA materialized view)computed column

答案 1 :(得分:0)

如果搜索日期/范围是常见要求,也许可以考虑添加Computed Column