Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 当只从datetime中选择日期时-哪一个是最好的,为什么?_Sql_Sql Server_Sql Server 2008_Tsql_Sql Server 2005 - Fatal编程技术网

Sql 当只从datetime中选择日期时-哪一个是最好的,为什么?

Sql 当只从datetime中选择日期时-哪一个是最好的,为什么?,sql,sql-server,sql-server-2008,tsql,sql-server-2005,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2005,因此,在我最近的工作中,关于从getdate或从datetime列中选取月份的最佳方式,存在一些分歧 据我所知,有两种方法是相当标准的: 方法1: 方法2: 我非常喜欢方法2,因为我发现它更容易内化,而且速度稍微快一点。然而,我被告知方法1是实现这一点的标准方法。我的问题是为什么?这两种方法中,哪一种最适合作为从我的存储库中的日期开始计算一个月的方法?为什么?我认为前者更好,因为它不涉及浮点数学,只需要访问datetime内部存储中的第一个整数。请参见我运行脚本进行测试,您的方法1和方法2在速度

因此,在我最近的工作中,关于从getdate或从datetime列中选取月份的最佳方式,存在一些分歧

据我所知,有两种方法是相当标准的:

方法1:

方法2:


我非常喜欢方法2,因为我发现它更容易内化,而且速度稍微快一点。然而,我被告知方法1是实现这一点的标准方法。我的问题是为什么?这两种方法中,哪一种最适合作为从我的存储库中的日期开始计算一个月的方法?为什么?

我认为前者更好,因为它不涉及浮点数学,只需要访问datetime内部存储中的第一个整数。请参见

我运行脚本进行测试,您的方法1和方法2在速度上都非常相似。查尔斯·布雷塔纳发布的答案实际上在每次测试中都比较慢。当然,这些都是相当不科学的,所以你自己来测试一下。以下是我写的剧本:

declare @starttime datetime
declare @endtime datetime

set @starttime = GETDATE()
print convert(varchar(30), @starttime, 109)

declare @cnt int
set @cnt = 0

declare @datevar datetime

while @cnt < 10000000
begin

    select @datevar = DateAdd(Day, 0, DateDiff(Day, 0, Getdate())) -- Replace this with whichever function you'd like to test
        , @cnt = @cnt + 1
end

set @endtime = GETDATE()
print convert(varchar(30), @endtime, 109)

print cast(datediff(ms, @starttime, @endtime) as varchar(20)) + ' ms'

只需将select@datevar=行替换为适当的行即可。在我的开发机器上,方法1和2通常在7200-7300毫秒内运行。Charles发布的方法在SQL Server 2008中的平均运行时间通常为8300-8500毫秒,我也很高兴:

SELECT CONVERT(DATE, CURRENT_TIMESTAMP);
除了更加简单和自文档化之外,这是一个例外,在这种情况下,转换可以应用于列,并且仍然使用索引。例如,如果两者的性能大致相同,那么哪个更容易阅读

WHERE CONVERT(DATE, col) = CONVERT(DATE, CURRENT_TIMESTAMP)
Vs


要从getdate开始计算月份,请执行以下操作:

SELECT DATEPART(MONTH, GETDATE())

这有什么好处?从我发现的情况来看,方法2最终会更快。我想我的帖子现在没有那么有意义了,因为查尔斯编辑了他的文章。不管是哪种方式,它仍然有助于证明测试不同方法是多么容易。我知道我个人在教育水平上仍然从中受益。绝对值得保留。谢谢大家!!你真的是说从一个日期算起一个月吗?请注意,你算的是一天而不是一个月。第二个稍微快一点,但是如果将语法更改为:-DateAddDay,DateDiffDay,0,Getdate,0-那么第一个语法似乎比第二个语法运行得更快。但是,CastGetdate作为日期-获胜。但是没有我预期的那么多,我是古玩,为什么人们不把它用于更小的查询,因为它在语法上很简单。。。有什么想法吗?
WHERE CONVERT(DATE, col) = CONVERT(DATE, CURRENT_TIMESTAMP)
WHERE col >= CONVERT(DATE, CURRENT_TIMESTAMP) -- or any of your alternatives
AND col < DATEADD(DAY, 1, CONVERT(DATE, CURRENT_TIMESTAMP))
SELECT CONVERT(DATETIME, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));
SELECT DATEPART(MONTH, GETDATE())