代码之家  ›  专栏  ›  技术社区  ›  user72491

TSQL默认最小日期时间

  •  20
  • user72491  · 技术社区  · 17 年前

    使用Transact-SQL是否可以在列(在create table语句中)上指定默认的日期时间,以便日期时间是日期时间值的最小可能值?

    create table atable
    (
      atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
      Modified datetime DEFAULT XXXXX??????
    )
    

    也许我应该让它空着。

    7 回复  |  直到 11 年前
        1
  •  39
  •   Chris    17 年前

    据我所知,不存在返回这个函数,您必须硬设置它。

    尝试从0等值强制转换以获取最小日期将默认为01-01-1900。

    如前所述,最好将其设置为空(如果需要,请在阅读时使用isNull),或者如果您担心设置正确,甚至可以在表上设置触发器,以便在编辑时设置修改日期。

    如果你已经确定了最短的日期,那么:

    create table atable
    (
      atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
      Modified datetime DEFAULT '1753-01-01'
    )
    
    
        2
  •  15
  •   The Dag    15 年前

    我同意“不要使用魔法值”中的观点。但我想指出的是,有时采用这种解决方案是合法的。

    设置列可以为空是有代价的:空是不可索引的。类似“获取自2010年初以来未修改的所有记录”的查询包括那些从未修改过的记录。如果我们使用一个可以为空的列,那么就必须使用[modified]<@cutoffdate或[modified] 是空的 ,这反过来强制数据库引擎执行表扫描,因为没有索引空值。这最后 可以 成为一个问题。

    在实践中,如果不引入实际的、真实的性能惩罚,那么应该使用空值。但是很难知道,除非你知道现在的实际数据量是多少,并且在所谓的可预见的未来会是多少。您还需要知道是否有很大一部分记录具有特殊的值——如果是这样,那么索引它就没有意义了。

    简而言之,根据死亡/经验法则,一个人应该为空。但是,如果有大量的记录,数据经常被查询,并且只有很小的一部分记录具有空/特殊值,那么根据这些信息定位记录可能会获得显著的性能增益(当然,只要创建了索引!)我觉得这有时可以证明“魔法”值的使用是合理的。

        3
  •  11
  •   DJ.    17 年前

    “也许我应该让它空着”

    不要使用幻数-这是一个糟糕的做法-如果你没有一个值,就让它为空

    否则,如果您真的想要一个默认日期-使用发布的其他技术之一来设置一个默认日期

        4
  •  5
  •   Irshad huMpty duMpty    11 年前

    除非你正在做数据库来跟踪一个多世纪前的历史时间,使用

    Modified datetime DEFAULT ((0)) 
    

    完全安全可靠,允许比“1753-01-01”更优雅的查询,比“1753-01-01”更高效的查询 NULL .

    但是,自从第一次修改 datetime 是插入记录的时间,可以使用:

    Modified datetime NOT NULL DEFAULT (GETUTCDATE())
    

    这样就避免了整个问题,并且使插入更容易、更安全——就像你根本不插入它,而SQL做家务一样:—)

    有了它,您仍然可以使用0进行优雅和快速的查询,因为它被保证总是低于任何生成的插入。 GETUTCDATE() .

        5
  •  3
  •   bopapa_1979    15 年前

    有时,您继承的脆弱代码已经在很多地方期望魔法值。每个人都是正确的,如果可能,您应该使用空值。但是,作为确保对该值的每个引用都相同的快捷方式,我喜欢将SQL中的“常量”(因为缺少更好的名称)放在一个scaler函数中,然后在需要该值时调用该函数。这样,如果我想把它们都更新成其他的东西,我可以很容易地做到。或者如果我想改变默认值,我只有一个地方可以更新它。

    下面的代码创建函数和一个表,使用它作为默认的日期时间值。然后插入并从表中选择,而不指定要修改的值。然后自己清理。我希望这有帮助。

    -- CREATE FUNCTION
    CREATE FUNCTION dbo.DateTime_MinValue ( )
    RETURNS DATETIME
    AS 
        BEGIN
            DECLARE @dateTime_min DATETIME ;
            SET @dateTime_min = '1/1/1753 12:00:00 AM'
            RETURN @dateTime_min ;
        END ;
    GO
    
    
    -- CREATE TABLE USING FUNCTION FOR DEFAULT
    CREATE TABLE TestTable
    (
      TestTableId INT IDENTITY(1, 1)
                      PRIMARY KEY CLUSTERED ,
      Value VARCHAR(50) ,
      Modified DATETIME DEFAULT dbo.DateTime_MinValue()
    ) ;
    
    
    -- INSERT VALUE INTO TABLE
    INSERT  INTO TestTable
            ( Value )
    VALUES  ( 'Value' ) ;
    
    
    -- SELECT FROM TABLE
    SELECT  TestTableId ,
            VALUE ,
            Modified
    FROM    TestTable ;
    
    
    -- CLEANUP YOUR DB
    DROP TABLE TestTable ;
    DROP FUNCTION dbo.DateTime_MinValue ;
    
        6
  •  0
  •   Scott Ivey    17 年前

    我认为你唯一的选择是一个常数。上面说了——不要用它——坚持空值而不是假日期。

    create table atable
    (
      atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
      Modified datetime DEFAULT '1/1/1753'
    )
    
        7
  •  0
  •   Indeed is Trash    17 年前

    我想这会奏效…

    create table atable
    (
      atableID int IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
      Modified datetime DEFAULT ((0))
    )
    

    编辑:这是错误的…最小的SQL日期时间值是1/1/1753。我的解决方案提供日期时间=1/1/1900 00:00:00。其他答案有正确的最短日期…