【问题标题】:Incement value of datetime field日期时间字段的增量值
【发布时间】:2013-08-13 11:30:39
【问题描述】:

我正在使用 SQLServer2008R2。我有一个名为RunningDate 的专栏。

我想要的是如果今天我将RunningDate 的值设置为2013-08-13 00:00:00.000,那么明天它将自动更新为2013-08-14 00:00:00.000

我知道DATEADD 功能,但如何在上述场景中使用它?

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 如果它总是与当前日期保持同步 - 为什么还要存储它呢??
  • 是否应该将 RunningDate 仅应用于表中的新记录,还是真的打算更新现有记录?在前一种情况下,将列的默认值设置为 CAST(CAST(GETDATE() AS DATE) AS DATETIME)

标签: sql-server sql-server-2008-r2


【解决方案1】:

你有两个选择:

选项 A

将 RunningDate 列从您的表中移除,并改为创建一个视图。将 RunningDate 列添加到视图中,为 CAST(CAST(GETDATE() AS DATE) AS DATETIME)

选项 B

创建一个在午夜定期更新表的 SQL Server 代理作业。请记住去掉日期的时间部分(例如使用选项 A 中的强制转换),因为您永远无法确定语句恰好在 00:00:00.000 运行。

【讨论】:

    【解决方案2】:

    试试这个 -

    DECLARE @temp TABLE
    (
          ID INT PRIMARY KEY
        , RunningDate DATETIME
    )
    
    INSERT INTO @temp (ID)
    VALUES (1),(2),(3),(5),(8)
    
    UPDATE tt
    SET RunningDate = CAST(DATEADD(dd, t.rn, GETDATE()) AS DATE)
    FROM @temp tt
    JOIN (
        SELECT 
              ID
            , rn = ROW_NUMBER() OVER (ORDER BY 1/0) - 1
        FROM @temp
    ) t ON t.ID = tt.ID
    
    SELECT * 
    FROM @temp
    

    输出 -

    ID          RunningDate
    ----------- -----------------------
    1           2013-08-13 00:00:00.000
    2           2013-08-14 00:00:00.000
    3           2013-08-15 00:00:00.000
    5           2013-08-16 00:00:00.000
    8           2013-08-17 00:00:00.000
    

    【讨论】:

    • 我不想手动更新..你能告诉我如何自动执行你的查询吗?
    • 尝试使用SQL Agent的每日计划。
    【解决方案3】:

    如果它只有一个字段,我建议不要将其添加到数据库中。如果要在存储过程中使用它,请使用

    SELECT GETDATE()
    

    SELECT DATEADD(day, DATEDIFF(day, '19000101', GETDATE()), '19000101');
    

    在您的代码中匹配或 DateTime.Now - 如果它是 .NET。仅将一个条目存储到表中就会增加很多开销。

    【讨论】:

    • 好的,但是你应该还是可以计算出来的,不需要存储。
    猜你喜欢
    • 2015-12-19
    • 2011-04-20
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多