gpt4 book ai didi

sql - 在 SQL where 子句中使用带有 IsDate 的 case 语句

转载 作者:行者123 更新时间:2023-12-05 01:17:49 25 4
gpt4 key购买 nike

我正在尝试清理以下代码中的 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 ,但我觉得必须有一种更简单的方法来实现相同的结果。

最佳答案

您需要在 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 。 . .但格式不明确。

关于sql - 在 SQL where 子句中使用带有 IsDate 的 case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com