where 子句中的日期返回 0 行

LeC*_*oir 0 sql t-sql sql-server sql-server-2019 sql-server-2019-express

我试图按如下方式获取数据, WHERE DateCommande = '2018-09-05' 但它在我的计算机上不起作用。

SELECT * 
  FROM dbo.Commande;
Run Code Online (Sandbox Code Playgroud)

返回行,包括在列中显示2018-09-05为日期时间值的行datetime

但是,在我的计算机上的 SSMS 上,如果我添加一个WHERE子句,查询将返回 0 行:

SELECT *
  FROM dbo.Commande
  WHERE DateTimeColumn = '2018-09-05 00:00:00.000';
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 7

yyyy-mm-dd hh:mm:ss.000不是语言和区域设置安全的格式

SELECT CONVERT(datetime, '2021-09-07');
SET LANGUAGE Nederlands;
SELECT CONVERT(datetime, '2021-09-07');
Run Code Online (Sandbox Code Playgroud)

结果(db<>fiddle):

-----------------------
2021-09-07 00:00:00.000

-----------------------
2021-07-09 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

请使用yyyy-mm-ddThh:mm:ss.000- T 非常重要。所以:

WHERE DateCommande = '2018-09-05T00:00:00.000';
Run Code Online (Sandbox Code Playgroud)

或者就您而言,可能只是更接近您问题中的内容,而不是屏幕截图中的内容:

WHERE DateCommande = '20180905'; -- YYYYMMDD *not* YYYY-MM-DD
Run Code Online (Sandbox Code Playgroud)

但是,除非您只想要那些没有时间的行,或者确定永远不会有与日期关联的时间(在这种情况下,为什么不是数据类型date?),否则这些查询都不安全。更好的说法是:

WHERE DateCommande >= '20180905'
  AND DateCommande <  '20180906';
Run Code Online (Sandbox Code Playgroud)

Regional formats有关更多背景信息,请参阅此处标题部分中的链接:

  • 哈哈@“负责任地约会” (3认同)