Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Datetime Select语句中的SQL Server日期时间转换_Datetime_Sql Server 2005 - Fatal编程技术网

Datetime Select语句中的SQL Server日期时间转换

Datetime Select语句中的SQL Server日期时间转换,datetime,sql-server-2005,Datetime,Sql Server 2005,我有一个数据库表,它有一个date\u time列。我创建了一个视图,在该视图中,我从date_time值位于两个日期之间的表中提取记录。举个例子,假设视图正在提取“2015-04-20”和“2015-04-26”之间的所有记录。但是,当我检查最小和最大日期时,最小日期是2015-04-19 17:01:49.000 CREATE VIEW [dbo].[testview] AS SELECT * FROM table WHERE EventDateTime BETWEEN '2015-04-2

我有一个数据库表,它有一个date\u time列。我创建了一个视图,在该视图中,我从date_time值位于两个日期之间的表中提取记录。举个例子,假设视图正在提取“2015-04-20”和“2015-04-26”之间的所有记录。但是,当我检查最小和最大日期时,最小日期是2015-04-19 17:01:49.000

CREATE VIEW [dbo].[testview]
AS
SELECT * FROM table WHERE
EventDateTime BETWEEN '2015-04-20' AND '2015-04-26'
ORDER BY EventDateTime ASC
我在本表中有2014年1月1日至2015年4月29日的记录。当我检查结果时,它们大部分看起来都正常,除了出于某种原因,它一直在拉一个带有2015-04-19 17:01:49.000时间戳的记录。所有其他记录都在过滤器内。为什么?

插入数据库的数据点是太平洋时间,而不是UTC时间。没有进行任何更改,数据只是使用PDT时间戳生成的,并且该数据直接插入到数据库中,无需进行任何操作

SQL Server没有时区的概念,它从Windows继承系统时间。此SQL server安装所在服务器的时区是中心时间。SQL Server是否根据自己的系统时间在内部转换时间,也就是说,由于它处于中心时间,它假设所有数据点都是UTC,然后转换为中心时间?不是搜索2015-04-20 00:00:00以上的日期时间,而是搜索 对于日期时间大于2015-04-19 18:00:00的记录?然而,如果是这样的话,上述时间戳仍然不起作用


有人能解释一下发生了什么吗?

由于您使用的是SQL Server 2005,并且datetimeoffset作为数据类型不可用,因此您可以向表中添加一个字段,用于存储时区信息。看这个和一个类似的问题

然后,您可以在查询中使用该信息来调整时区偏移

另一种方法是使用
smallint
as以分钟为单位存储偏移量

您可以将计算列添加到表中:

或在查询中动态执行计算:

我还发现了其他关于时区处理的文章/讨论,祝你好运


如果使用了
datetimeoffset
,SQL Server确实有时区的概念。我不认为这是您正在使用的数据类型?@Mark:no,我的date\u time列的数据类型是datetime。您正在使用哪个版本的SQL Server?从那时起就可以使用了SS2008@Tony:Microsoft SQL Server 2005-9.00.3042.00
datetime
type不知道/不关心时区,因此您的查询不应返回值
2015-04-19 17:01:49.000
。检查SSMS中的实际查询和输出。也许您正在查看应用程序中的输出,而该应用程序以某种方式操纵结果。也许你只是看错了专栏,谢谢你;我想我会实施这个。然而,它并没有真正回答我的问题:如果我在2015-04-20和2015-04-26之间提取所有记录,为什么我会得到一个时间戳为2015-04-19 17:01:49.000的记录?我正在努力了解根本原因。
CREATE TABLE Table1 (
    DateTimeUTC datetime,
    OffsetMinutes smallint,
    DateTimeLocal AS DATEADD(minute, OffsetMinutes, DateTimeUTC)
)
SELECT DateTimeUTC
     ,OffsetMinues
     ,DATEADD(minute, OffsetMinutes, DateTimeUTC) as DateTimeLocal
FROM Table1