我正在查询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 函数的参数,或者只是之间的常规,但是没有结果。
答案 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