2010-06-10 162 views
2

我正在(或修复bug)在VS 2005 C#中开发的应用程序上工作。应用程序将数据保存到SQL Server 2005.其中一个插入SQL语句尝试将时间戳值插入到具有GetDate()TSQL函数作为日期时间值的字段中。将GetDate()函数的日期时间值插入到SQL Server(2005)表中?

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服务器的本地日期时间)的新行?

回答

1

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

+0

你说得对,G马斯特罗斯。我必须要求DBA进行更改,而且我无法将日期时间值设置为SmallDateTime数据类型的毫秒精度。谢谢! – 2010-06-10 21:57:10

+0

由于SmallDate有限制,我必须使用FieldDt与WHERE子句的计数作为条件来查找具有新值的FieldDt。我可能需要提出更改db的请求,但是在我的工作公司需要很长时间。 – 2010-06-11 21:12:05

0

也许这会工作,而不是GETDATE的 - SYSDATETIME() 这里看看,如果你能找到你需要的东西 - http://msdn.microsoft.com/en-us/library/ms188383.aspx

+0

我认为该函数只在SQL 2008中可用。 – 2010-06-10 21:42:50

+0

问题状态SQL Server 2005,但SYSDATETIME()仅适用于SQL Server 2008及更高版本。 – 2010-06-10 21:43:39

+0

oops ya没有意识到它... G马斯特罗斯可能是正确的..检查你的数据类型的列。 – Vishal 2010-06-10 21:48:44

1

我猜你没有在DateTime字段中存储GetDate()值。如果将值存储在日期时间字段中,您将获得DateTime类型允许的最大精度。另外,DateTime是一个二进制类型(实际上是一个double),所以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

0

当你在SQL 2005,别忘了GETUTCDATE()函数来保证,无论您的服务器实际位于何处,都有恒定的时间参考。想象一下,你在冬天(即GMT + 0)在英国有服务器,并且在上午10点30分保存一个记录。然后切换到加利福尼亚州托管的SQL服务器(GMT + 8),8小时后保存另一条记录。

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

没有真正回答这个问题,但在你的情况下很重要。

+0

感谢您的意见。无论位置如何,getutcdate()都是日期时间。但是,对于我的情况,客户端需要到本地日期时间,所以我必须在TSQL中使用GetDate()来在服务器端执行INSERT SQL。 – 2010-06-10 22:26:22

0

你可以在程序中使用这个和如果没有程序只使用getdate()

插入到[DBO]。[Tbl_User](用户ID,Uvendoremail,UAddress,Ddob,DMobile, DEmail,DPassword,DAddress,CreatedDate)值(@用户ID,@ vendoremail @地址,@ DOB,@移动,@ email,@ dpassword,@ daddress,getdate()

相关问题