SELECT,使用SQL Server临时操作数据

时间:2011-08-09 08:30:08

标签: c# sql vb.net tsql sql-server-2008

数据库有一个字段“结束日期”,而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时才能正常运行。你知道为什么吗?

5 个答案:

答案 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.NULLNULL值传递给存储过程或查询本身。 如果你能提供应该传递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。我曾经做过一个项目,曾经有人用类似的“无效”日期值做了类似事情,并且它没有造成任何问题。