【问题标题】:Insert a datetime value with GetDate() function to a SQL server (2005) table?将带有 GetDate() 函数的日期时间值插入 SQL Server (2005) 表?
【发布时间】:2017-01-25 15:21:24
【问题描述】:

我正在使用 VS 2005 C# 开发的应用程序(或修复错误)。应用程序将数据保存到 SQL Server 2005。其中一条插入 SQL 语句尝试使用 GetDate() TSQL 函数将时间戳值插入到字段中作为日期时间值。

Insert into table1 (field1, ... fieldDt) values ('value1', ... GetDate());

使用GetDate() 函数的原因是SQL 服务器可能在一个删除站点,并且日期时间可能在不同的时区。因此,GetDate() 将始终从服务器获取日期。由于可以在 SQL Management Studio 中验证该功能,因此我得到了以下信息:

SELECT GetDate(), LEN(GetDate());
-- 2010-06-10 14:04:48.293   19

我意识到的一件事是长度不能达到毫秒,即 19 实际上是“2010-06-10 14:04:48”。无论如何,我现在遇到的问题是,在插入之后,fieldDt 实际上具有最多分钟的日期时间值,例如,'2010-06-10 14:04:00'。我不确定为什么。我无权使用触发器更新或更改表以更新字段。

我的问题是,如何使用 INSERT T-SQL 添加一个新行,其日期时间值(SQL 服务器的本地日期时间)精度高达毫秒?

【问题讨论】:

    标签: visual-studio tsql


    【解决方案1】:

    检查你的桌子。我的猜测是 FieldDT 列的数据类型为 SmallDateTime ,它存储日期和时间,但精确到最接近的分钟。如果我的猜测是正确的,那么除非您更改列的数据类型,否则您将无法存储秒或毫秒。

    【讨论】:

    • 你是对的,G Mastros。我必须要求 DBA 进行更改,但我无法使用 SmallDateTime 数据类型使日期时间值达到毫秒精度。谢谢!
    • 由于 SmallDate 有限制,我必须使用带有 WHERE 子句的 FieldDt 计数作为条件来确定 FieldDt 是否具有新值。我可能需要请求更改数据库,但在我的工作公司需要很长时间。
    【解决方案2】:

    我猜您没有将 GetDate() 值存储在 DateTime 字段中。如果您将值存储在日期时间字段中,您将获得 DateTime 类型允许的最大精度。此外,DateTime 是二进制类型(实际上是双精度),因此 19 表示 19 个字节,而不是 19 个字符。

    尝试用这样的日期时间字段创建一个简单的表

    CREATE TABLE [dbo].[DateTable](
    [DateField] [datetime] NOT NULL
    )
    

    并添加日期

    insert into datetable (datefield) values(getdate())
    

    当您执行选择时,您将返回一个包含毫秒的值。以下查询

    select *  from datetable
    

    返回

    2010-06-11 00:38:46.660

    【讨论】:

      【解决方案3】:

      也许这会代替 getdate - SYSDATETIME() 如果你能找到你需要的东西,请看这里 - http://msdn.microsoft.com/en-us/library/ms188383.aspx

      【讨论】:

      • 我认为该功能仅在 SQL 2008 中可用。
      • 问题说明 SQL Server 2005,但 SYSDATETIME() 仅适用于 SQL Server 2008 及更高版本。
      • 哎呀,你没有意识到......G Mastros 可能是对的......检查你该列的数据类型。
      【解决方案4】:

      当您使用 SQL 2005 时,不要忘记 getutcdate() 函数,以确保无论您的服务器实际位于何处,您都有一个恒定的时间参考。

      想象一下,你的服务器在英国冬天(即 GMT+0),并在上午 10:30 保存了一条记录。然后,您切换到托管在加利福尼亚 (GMT+8) 的 SQL 服务器,并在 8 小时后保存另一条记录。

      使用getdate(),两者保存记录相同的时间“10:30:00”。使用getutcdate(),第一次保存记录在“10:30:00”,第二次保存记录在“18:30:00”。

      不是真正回答问题,但在你的情况下很重要。

      【讨论】:

      • 谢谢你们。 getutcdate() 用于日期时间,无论位置如何。但是,对于我的情况,客户端需要字段的本地日期时间,所以我必须在 TSQL 中使用 GetDate() 在服务器端执行 INSERT SQL。
      【解决方案5】:

      您可以在程序中这样使用,如果没有程序,请仅使用 getdate()

      插入 [dbo].[Tbl_User] (UserId,Uvendoremail,UAddress,Ddob,DMobile, DEmail,DPassword,DAddress,CreatedDate) 值(@userid,@vendoremail@address,@dob,@mobile,@email,@dpassword,@daddress,getdate() )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        相关资源
        最近更新 更多