1
54
这要简洁得多:
|
2
18
你几乎必须保持WHERE条款的左边是干净的。所以,通常情况下,你会做如下的事情:
(有些人更喜欢dateadd(d,1,@activitydatemnight),但这是相同的事情)。 不过时区表让事情有点复杂。您的代码片段中有点不清楚,但看起来有点不清楚。该表是在带有时区标识符的格林威治标准时间内,然后您要添加偏移量以与本地时间内的@activitydateMidnight进行比较。不过,我不确定ds.localtimezone是什么。 如果是这样,那么您需要将@activitydatemnight改为gmt。 |
3
4
|
4
3
确保阅读 Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code 这样您就可以确保优化器在处理日期时能够有效地利用索引。 |
5
2
Eric Z Beard:
是的,但是当你说你对2008年1月1日的EST活动感兴趣时:
你只需要转换 那个 到格林威治标准时间(我忽略了查询EST进入EDT前一天的复杂性,反之亦然):
应该是“2008年1月1日凌晨4:00”。然后,您只需在GMT中搜索:
相关事件存储在格林威治标准时间2008年1月2日凌晨3:00。您甚至不需要事件表中的时区(至少为此目的)。 因为eventtime不在函数中,所以这是一个直接的索引扫描——应该非常有效。让eventtime成为聚集索引,它就会飞走。;) 就我个人而言,我希望应用程序在运行查询之前将搜索时间转换为gmt。 |
6
1
这将从日期中删除时间组件:
|
7
1
你在这里的选择权被宠坏了。如果您使用Sybase或SQL Server 2008,则可以创建日期类型的变量,并为其分配日期时间值。数据库引擎为您省去了时间。下面是一个快速而肮脏的测试(代码使用Sybase方言):
对于SQL 2005和更早版本,您可以将日期转换为不包含时间组件的格式的varchar。例如,以下返回2008.08.22
102部分指定了格式(联机丛书可以为您列出所有可用的格式) 所以,您所能做的就是编写一个函数,它获取一个日期时间并提取日期元素并丢弃时间。像这样:
然后您可以为同伴使用该函数
|
8
1
Eric Z Beard:
好的-回到画板上。试试这个:
将@activitydate转换为本地时间,并与之进行比较。这是您使用索引的最佳机会,尽管我不确定它是否有效-您应该尝试它并检查查询计划。 下一个选项是一个索引视图,带有一个索引的、计算的TimelineTocheck 在当地时间 . 然后你回到:
它肯定会使用索引——尽管在插入和更新时会有一些开销。 |
9
0
我将使用datepart的dayofyear函数:
参见日期部分参考 here . |
10
0
关于时区,还有一个理由可以在一个时区(最好是UTC)中存储所有日期。不管怎样,我认为使用datediff、datepart和不同的内置日期函数的答案是最好的选择。 |