gpt4 book ai didi

SQL 日期过滤

转载 作者:行者123 更新时间:2023-12-05 02:19:31 24 4
gpt4 key购买 nike

只是一个相当一般的日期过滤问题...

我有一个包含 YYYYMMDD(无时间)的日期字段。在查找当月的交易时,如果我这样做,我会得到不同的结果......

and MyDateField between '2017-03-01' and '2017-03-31'

如果我这样做...

and Year(MyDateField) = '2017' and Month(MyDateField) = '3'

看起来“between”方法排除了 3 月 1 日发生的任何事情(其他交易是 future 日期)。

这是为什么?

这些是“between”方法的结果...

20170303
20170327
20170309
20170324
20170331
20170306

这些是“年/月”结果...

20170303
20170327
20170309
20170324
20170301
20170331
20170306
20170301

数据存储为 nvarchar(8) - 我应该先转换为日期吗?

最佳答案

BETWEEN 包含在内。

and MyDateField between '2017-03-01' and '2017-03-31'

等同于:

and MyDateField >= '2017-03-01' 
and MyDateField <= '2017-03-31'

我唯一的解释是 MyDateField 的类型不是 date,而是datetime 之类的类似于可能有时间成分。

并且您表中的某些值实际上具有此非零时间分量。

因此,您的查询应如下所示:

and MyDateField >= '20170301' 
and MyDateField < '20170401'

有关详细信息,请参阅 Bad habits to kick : mis-handling date / range queries亚伦·伯特兰 (Aaron Bertrand)。


好吧,在你说列类型是 nvarchar(8) 之后,很明显 strings '2017-03-01' 和 '20170301' 的比较' 不会带来任何好处。

当您使用 BETWEEN 时,您比较的是字符串,而不是日期。当您使用 YEARMONTH 时,服务器会在后台将您的 nvarchar(8) 值转换为日期(并破坏性能)。


可以将日期存储为nvarchar(8),但随后您需要将它们与相同格式的字符串进行比较,如下所示(没有破折号):

and MyDateField >= '20170301' 
and MyDateField <= '20170331'

将它们存储为 char(8) 会更好,但将它们存储为 date 会好得多。 date 为 3 个字节,而 nvarchar(8) 至少为 17 个字节。

参见 Bad habits to kick : choosing the wrong data type .

关于SQL 日期过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42528798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com