我正在尝试清理以下代码中的 where 子句语句:
SELECT
CONVERT(datetime, [UTC_Time_Stamp], 127) AS TimeStamp
FROM
Table
WHERE
CASE
WHEN ISDATE([UTC_Time_Stamp]) = 1
THEN CONVERT(datetime, [UTC_Time_Stamp], 127)
ELSE CAST('1/1/1900' AS datetime)
END > CAST('11/09/2012' AS datetime)
AND
CASE
WHEN ISDATE([UTC_Time_Stamp]) = 1
THEN CONVERT(datetime, [UTC_Time_Stamp], 127)
ELSE CAST('1/1/3000' AS datetime)
END < CAST('11/10/2012' as datetime)
ORDER BY
TimeStamp;
UTC_Time_Stamp
存储为字符串,有时为空。我之前在 where 子句中遇到了转换错误。我按照这个问题的建议修复了错误here https://stackoverflow.com/questions/6944116/sql-server-where-clause-where-value-is-convertible,但我觉得必须有一种更简单的方法来达到相同的结果。
You need在a内进行转换case
陈述。 SQL是一种描述性语言,不保证处理的顺序。所以,一个where
子句不一定发生在其他处理之前,即使它位于子查询或 CTE 中。然而,SQL 确实保证了处理的顺序case
语句(不包含具有聚合函数的表达式)。
您可以使用子查询来简化语句:
select TimeStamp
FROM (select t.*,
Case When ISDATE([UTC_Time_Stamp]) = 1 Then CONVERT(datetime, UTC_Time_Stamp, 127) end) as TimeStamp
from Table t
) t
WHERE coalesce(TimeStamp, cast('1/1/1900' as datetime)) > cast('11/09/2012' as datetime) and
coalesce(TimeStamp, cast('1/1/3000' as datetime)) < cast('11/10/2012' as datetime)
ORDER BY TimeStamp;
这会将有效值转换为时间戳。然后您可以在外部查询中使用该变量。
我还鼓励您习惯 ANSI 标准日期格式(YYYYMMDD 或 YYYY-MM-DD),而不是像“11/10/2012”这样不明确的格式。您可能清楚这意味着 2012-11-10 。 。 。或者是2012年10月11日。 。 。但格式不明确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)