SQL 查询 returns 一个负数但不将其解释为负数而是正数
SQL Query returns a negative number but does not interpret it as a negative number but a positive number
当我 运行 查询时,它正在执行 DATEDIFF 并得到一个负数,因为这是正确的,但它没有将整数解释为负数,而是解释为正数,导致使用错误的颜色打印因为它应该是红色的。当 return datediff <0.
时,我缺少什么来使负数工作应该打印红色
Select
STRING(
case
when datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) > 7
and "Table"."column" = '12' or "Table"."column" = 'JE'
then '</font><font color = green ><b>'
when datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) > 2
and
datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) <= 7
and "Table"."column" = '12' or "Table"."column" = 'JE'
then '</font><font color = yellow><b>'
when datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) < 2
and "Table"."column" = '12' or "Table"."column" = 'JE'
then '</font><font color = red><b>'
else '</font><font color = black >' end ,"Table"."column") AS "column"
您可能遇到了 operator precedence 问题。
您的条件是 diff and this or that
的变体。 and
的优先级高于 or
。 one and two or three
真的意味着...
(diff and this) or that.
换句话说,如果 that
为真,它将永远为真。在调用您的案例时,如果 "Table"."column" = 'JE'
为真,则整个语句将为真。这意味着你总是会变绿或变黑。
你的意思可能是
diff and (this or that)
和
(diff and diff) and (this or that)
其他说明。
- 将
end_date
和 end_time
转换为正确的日期和时间列。
- 添加一个
end_at
时间戳列,该列已连接它们。
这两者都会使查询更简单、更快;您不必转换字符串,像上面这样的比较将能够在 end_at
.
上使用索引
- 除非必须,否则不要引用 table 和列名,这会使它们成为 case-sensitive.
当我 运行 查询时,它正在执行 DATEDIFF 并得到一个负数,因为这是正确的,但它没有将整数解释为负数,而是解释为正数,导致使用错误的颜色打印因为它应该是红色的。当 return datediff <0.
时,我缺少什么来使负数工作应该打印红色Select
STRING(
case
when datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) > 7
and "Table"."column" = '12' or "Table"."column" = 'JE'
then '</font><font color = green ><b>'
when datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) > 2
and
datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) <= 7
and "Table"."column" = '12' or "Table"."column" = 'JE'
then '</font><font color = yellow><b>'
when datediff('hh',getdate(), ( CONVERT (CHAR(10),Table.end_date,121) ||' '|| Table.end_time ) ) < 2
and "Table"."column" = '12' or "Table"."column" = 'JE'
then '</font><font color = red><b>'
else '</font><font color = black >' end ,"Table"."column") AS "column"
您可能遇到了 operator precedence 问题。
您的条件是 diff and this or that
的变体。 and
的优先级高于 or
。 one and two or three
真的意味着...
(diff and this) or that.
换句话说,如果 that
为真,它将永远为真。在调用您的案例时,如果 "Table"."column" = 'JE'
为真,则整个语句将为真。这意味着你总是会变绿或变黑。
你的意思可能是
diff and (this or that)
和
(diff and diff) and (this or that)
其他说明。
- 将
end_date
和end_time
转换为正确的日期和时间列。 - 添加一个
end_at
时间戳列,该列已连接它们。
这两者都会使查询更简单、更快;您不必转换字符串,像上面这样的比较将能够在 end_at
.
- 除非必须,否则不要引用 table 和列名,这会使它们成为 case-sensitive.