加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

tsql – 日期之间的T-SQL夹杂

发布时间:2020-12-31 05:53:46 所属栏目:编程 来源:网络整理
导读:我正在行使SQL Server 2000中的T-SQL,我有一个表TRANSACTIONS,其日期列TRANDATE界说为DateTime,个中很多列与此题目无关. 该表添补了多年的买卖营业.我碰着了代码,测试,让我感想狐疑.有一个简朴的SELECT,像这样: SELECT TRANDATE,RECEIPTNUMBER FROM TRANSACTIONS

我正在行使SQL Server 2000中的T-SQL,我有一个表TRANSACTIONS,其日期列TRANDATE界说为DateTime,个中很多列与此题目无关.

该表添补了多年的买卖营业.我碰着了代码,测试,让我感想狐疑.有一个简朴的SELECT,像这样:

SELECT TRANDATE,RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010' and '12/31/2010' ORDER BY TRANDATE

而且它不返回我知道在该表中的两行数据.

通过上面的语句,它按次序返回的最后一行有一个TRANDATE:
2010-12-31 00:00:00.000

当我修改如下所示的语句时,我获得了该表中2010年12月的特殊两行:

SELECT TRANDATE,RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010 00:00:00' and '12/31/2010 23:59:59' ORDER BY TRANDATE

我试图找出为什么BETWEEN运算符在行使上面的第一个SELECT时在12/31/2010的24个周期内不包罗全部行.为什么它必要将明晰的小时数添加到SELECT语句中,犹如在第二个修改后的语句中一样,以使其拉出正确的行数?

是由于TRANDATE界说为“DATETIME”的方法?

基于这个发明,我以为我将不得不经验全部这些旧代码,由于这些BETWEEN运算符遍布这个旧体系,好像它没有正确地提取全部数据.我只想先从一些人哪里获得澄清.感谢!

办理要领

日期是一个时刻点,而不是时刻跨度.

’12 / 31/2010’也是一个概念.也就是说,这是十二月三十一日的半夜.
在这一点之后产生的统统都被忽略了.
这正是你想要的举动(纵然你还没故意识到).

不要觉适当你选择省略时刻部门时,它被神奇地假设为“任何”.这将是“所有为零”,即半夜.

假如您想在查询中包括成天,而不必指定23:59:59(趁便说一下,excludes the last second of the day,在当天23:59:59到00:00:00之间)第二天),您可以行使严酷的不等式(>,<)来限定您不想要的第一个时刻点:

WHERE TRANDATE >='12/01/2010 00:00:00' and TRANDATE < '01/01/2011'

可能通过较量投放到DATE的日期值:

WHERE CAST(TRANDATE AS DATE) between '12/01/2010' and '12/31/2010'

(可以将这种范例的逼迫转换放在WHERE子句中,it is sargable).

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读