数据库有一个字段“结束日期”,而1753/1/1应该是代表什么的值,因为我们不能在SQL Server中为datetime
分配空值。
在报告应用程序中使用的选择查询获取包括那些1753日期值的数据。好
问题
1753年日期导致报告计算地狱。报告中有很多计算,更改代码以忽略1753会很头疼,所以我在想
有没有办法告诉SQL Server:
SELECT *
FROM TABLE BUT IN END_DATE
WHERE VALUE='1753/1/1 01:00:00.000' REPLACE WITH PARAMETER1
CRUDE EDIT (目前无权访问调试器)
我记不住了但是我收到了像
这样的错误什么都不应映射到什么
当我尝试插入带有空日期的记录时!只有在C#中使用VB.NET时才能正常运行。你知道为什么吗?
答案 0 :(得分:4)
SELECT *
FROM TABLE
WHERE END_DATE =
CASE VALUE
WHEN VALUE = '1753/1/1 01:00:00.000' THEN PARAMETER1
ELSE VALUE
END
编辑:回答评论
您无法将NULL
分配给DateTime
字段,因为DateTime
是值类型,因此无法保留NULL
。使用SqlDateTime.NULL将NULL
值传递给存储过程或查询本身。
如果你能提供应该传递NULL
的代码 - 我可以给你更详细的例子。
答案 1 :(得分:1)
虽然我认为null应该用于表示某些东西没有值,但你可以尝试:
SELECT MyDate = CASE END_DATE
WHEN '1753/1/1 01:00:00.000' THEN YourDefaultValue
ELSE END_DATE
END
有关详细信息,请参阅msdn。
答案 2 :(得分:0)
SELECT field1, field2, field3,
'NEW_END_DATE' = CASE CAST(END_DATE AS DATE) = '1753-1-1'
THEN @Parameter
ELSE END_DATE
END
FROM TABLE;
答案 3 :(得分:0)
您需要使用案例
SELECT case when date_field = '1753/1/1 01:00:00.000' then @PARAMETER1
ELSE date_field END
FROM TABLE
答案 4 :(得分:0)
我猜你可能正在寻找这样的东西(注意你不能用SELECT *
来做;你必须明确选择你需要的列,除非你想要添加计算列使用不同的名称。)
SELECT
CASE
WHEN END_DATE = > '1753/1/1 01:00:00.000' THEN END_DATE
ELSE PARAMETER1
END 'END_DATE',
other_columns...
FROM
TABLE
但实际上,我建议您更改设计以使用NULL而不是您正在使用的这个奇怪的结束日期。 DATETIME列没有什么特别之处可以阻止它们为NULLable。我曾经做过一个项目,曾经有人用类似的“无效”日期值做了类似事情,并且它没有造成任何问题。