【问题标题】:SELECT, manipulate data temporary using SQL ServerSELECT,使用 SQL Server 临时操作数据
【发布时间】:2011-08-09 08:30:08
【问题描述】:

数据库有一个“结束日期”字段,1753/1/1 应该是什么都不代表的值,因为我们不能在 SQL Server 中将 null 分配给 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 时才会发生这种情况,它工作正常。你知道为什么吗??

【问题讨论】:

  • 顺便说一句,为什么不能将 null 分配给 SQL Server 中的日期时间?
  • 我不记得了,但是当我插入带有空日期的记录时,我得到并错误地说什么都不应该映射到某些东西上!仅当在 csharp 中使用 VB.NET 时才会发生这种情况,它工作正常。你知道为什么吗??
  • 发布您的代码在保存 null 时会引发错误,可能是因为 DateTIme 是值类型,所以您不能分配 NULL,所以您必须将 SqlDateTime() 对象保存到 dateTime 列中跨度>
  • 就是这样,我会模拟问题并尽快发布
  • 您是否也在过滤“开始日期”?

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


【解决方案1】:
SELECT * 
FROM TABLE
WHERE END_DATE = 
 CASE VALUE 
   WHEN VALUE = '1753/1/1 01:00:00.000' THEN PARAMETER1 
   ELSE VALUE
 END

编辑:对 cme​​ts 的回答

您不能将NULL 分配给DateTime 字段,因为DateTime 是一种值类型,因此它不能持久化NULL。使用SqlDateTime.NULLNULL 值传递给存储过程或查询自身。 如果你能提供应该通过NULL 的代码 - 我可以给你更详细的例子。

【讨论】:

    【解决方案2】:

    虽然我觉得应该用null来表示某事没有值,你可以试试:

    SELECT MyDate = CASE END_DATE   
        WHEN '1753/1/1 01:00:00.000' THEN YourDefaultValue
        ELSE END_DATE
    END 
    

    详情请见msdn

    【讨论】:

      【解决方案3】:
          SELECT field1, field2, field3, 
              'NEW_END_DATE' = CASE CAST(END_DATE AS DATE) = '1753-1-1' 
                   THEN @Parameter 
                   ELSE END_DATE 
               END
          FROM TABLE;
      

      【讨论】:

        【解决方案4】:

        你需要用一个案例

        SELECT case when date_field = '1753/1/1 01:00:00.000' then @PARAMETER1
        ELSE date_field END
        FROM TABLE 
        

        【讨论】:

          【解决方案5】:

          我猜您可能正在寻找类似的东西(请注意,您不能使用 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。我曾经参与过一个项目,有人用愚蠢的“无效”日期值做了类似的事情,但它导致了无穷无尽的问题。

          【讨论】:

          • 这种情况只有在使用 vb.net 时才会发生!知道为什么。
          • 嗯,听起来@sll 可以解决这个问题,所以我会听从这个建议并改用NULL。它可能会让你的生活更轻松。
          猜你喜欢
          • 2021-12-29
          • 2010-11-21
          • 1970-01-01
          • 2012-06-12
          • 2011-09-06
          • 1970-01-01
          • 2011-03-08
          • 2020-01-21
          • 1970-01-01
          相关资源
          最近更新 更多