Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 添加时间和日期_Sql_Sql Server_Date_Sql Server 2008 R2 - Fatal编程技术网

Sql 添加时间和日期

Sql 添加时间和日期,sql,sql-server,date,sql-server-2008-r2,Sql,Sql Server,Date,Sql Server 2008 R2,我在MSSQL 2008 R2中有两列:Workingdate和Startime。 由于应用程序设计中的错误,starttime未定义为日期+时间,而仅定义为时间(例如下午4:00时的1899-12-30 16:00:00.000) 现在,我面临一个无法添加日期和时间的问题 为什么 select convert(datetime,'2015-07-01 00:00:00.000') + convert(datetime,'1899-12-30 16:00:00.000') 2015-06-2

我在MSSQL 2008 R2中有两列:
Workingdate
Startime
。 由于应用程序设计中的错误,starttime未定义为日期+时间,而仅定义为时间(例如下午4:00时的
1899-12-30 16:00:00.000

现在,我面临一个无法添加日期和时间的问题

为什么

 select convert(datetime,'2015-07-01 00:00:00.000') + convert(datetime,'1899-12-30 16:00:00.000')

2015-06-29 16:00:00.000  and not 2015-07-01 16:00:00.000
谢谢你的帮助


抱歉:我找到了解决方案:日期来自VBA,第一天是1899-12-30,而不是SQL中的1900-01-01!!!因此,我必须添加+2

通常情况下,我会一直使用这种类型的操作

希望它有帮助

试试这个:

select dateadd(second, 
                datepart(hour,'1899-12-30 16:00:00.000') * 3600 + 
                datepart(minute,'1899-12-30 16:00:00.000') * 60 + 
                datepart(second,'1899-12-30 16:00:00.000'),
                '2015-07-01 00:00:00.000')
其思想是使用函数将所需的时间(以秒为单位)添加到基准日期(
2015-07-01 00:00:00.000
)。为了将记录时间转换为秒,我们使用函数three time从记录日期中提取小时、分钟和秒

要确定表中的日期,可以使用以下内容:

UPDATE [dbo].[MyTable]
SET [Date] =  DATEADD(SECOND, DATEPART(HOUR, [Date]) * 3600 + DATEPART(MINUTE, [Date]) * 60 + DATEPART(SECOND, [Date], '2015-07-01 00:00:00.000');
SELECT 
  cast('1899-12-30 16:00:00.000' as time)+
  cast('2015-07-01 00:00:00.000' as datetime)

您无法轻松使用dateadd进行此操作,简单的方法是将一列的时间与另一列的datetime相加,如下所示:

UPDATE [dbo].[MyTable]
SET [Date] =  DATEADD(SECOND, DATEPART(HOUR, [Date]) * 3600 + DATEPART(MINUTE, [Date]) * 60 + DATEPART(SECOND, [Date], '2015-07-01 00:00:00.000');
SELECT 
  cast('1899-12-30 16:00:00.000' as time)+
  cast('2015-07-01 00:00:00.000' as datetime)
结果:

2015-07-01 16:00

你不应该在没有提供示例的情况下发布这样的答案。特别是因为DATEADD在本例中不是一个简单的解决方案,有趣的是,它是正确的,尽管选择CAST(CONVERT(datetime,'1899-12-30 16:00:00.000')作为float是否定的!谢谢为什么要将日期时间转换为浮点?这总是可以用更好的方法来完成。我只是将其转换为检查数值。我如何在Oracle中实现这一点?是的,我知道,但我必须更改应用程序中的所有代码。。。!