Sql server SQL Server-在类型为DD/MM/YYYY的两个日期之间选择

Sql server SQL Server-在类型为DD/MM/YYYY的两个日期之间选择,sql-server,Sql Server,我想使用以DD/MM/YYYY格式提供的日期范围查询datetime字段 我知道要将datetime转换为我可以使用的DD/MM/YYYY格式: CONVERT(CARCHAR(10), ORDERDATE,103)` 在查询单个日期时,此操作非常有效,例如: SELECT DISTINCT CONVERT(DATE, ORDERDATE), CONVERT(CARCHAR(10), ORDERDATE,103) FROM ORDERS WHERE CONVERT(CARCHAR(10),

我想使用以DD/MM/YYYY格式提供的日期范围查询datetime字段

我知道要将datetime转换为我可以使用的DD/MM/YYYY格式:

CONVERT(CARCHAR(10), ORDERDATE,103)`
在查询单个日期时,此操作非常有效,例如:

SELECT DISTINCT 
CONVERT(DATE, ORDERDATE),
CONVERT(CARCHAR(10), ORDERDATE,103)
FROM ORDERS
WHERE CONVERT(CARCHAR(10), ORDERDATE,103) = '19/10/2017'
返回:
2017-10-19、19/10/2017

但是,它在日期范围内不起作用,例如:

WHERE CONVERT(CARCHAR(10), ORDERDATE,103) BETWEEN '17/10/2017' AND '19/10/2017'
返回:

2014-02-05
2016-12-12
2013-04-30

我知道有数百个关于SQL日期的线程,但它们似乎都是关于重新格式化输出,而不是准备输入。我是否需要重新格式化我的DD/MM/YYYY输入

要查询日期范围,请使用
日期
-数据类型,而不是
VARCHAR

如果列
ORDERDATE
的数据类型为
DATETIME

WHERE CONVERT(DATE, ORDERDATE) BETWEEN
CONVERT(DATE, '17/10/2017', 103) AND CONVERT(DATE, '19/10/2017', 103)
只有在开始日期和结束日期相同的情况下,
ORDERDATE
的转换才是必要的。(在这种情况下,如果未进行转换,则只返回时间值为'00:00:00.000'的日期)

编辑:
要省略对
ORDERDATE
的转换,您可以将时间添加到日期中,并将其转换为
DATETIME
,而不是
DATE
,如下所示:

WHERE ORDERDATE BETWEEN
CONVERT(DATETIME, '19/10/2017 00:00:00') AND CONVERT(DATETIME, '19/10/2017 23:59:59.999');
或者更简单,如@Used_By_的答案中所建议的:

WHERE ORDERDATE >= '20171017' AND ORDERDATE < '20171020' --Note the end date is here +1 day
其中ORDERDATE>='20171017'和ORDERDATE<'20171020'——注意结束日期在这里+1天

要查询日期范围,请使用
日期
-datatype而不是
VARCHAR

如果列
ORDERDATE
的数据类型为
DATETIME

WHERE CONVERT(DATE, ORDERDATE) BETWEEN
CONVERT(DATE, '17/10/2017', 103) AND CONVERT(DATE, '19/10/2017', 103)
只有在开始日期和结束日期相同的情况下,
ORDERDATE
的转换才是必要的。(在这种情况下,如果未进行转换,则只返回时间值为'00:00:00.000'的日期)

编辑:
要省略对
ORDERDATE
的转换,您可以将时间添加到日期中,并将其转换为
DATETIME
,而不是
DATE
,如下所示:

WHERE ORDERDATE BETWEEN
CONVERT(DATETIME, '19/10/2017 00:00:00') AND CONVERT(DATETIME, '19/10/2017 23:59:59.999');
或者更简单,如@Used_By_的答案中所建议的:

WHERE ORDERDATE >= '20171017' AND ORDERDATE < '20171020' --Note the end date is here +1 day
其中ORDERDATE>='20171017'和ORDERDATE<'20171020'——注意结束日期在这里+1天

SQL Server日期信息不应以“格式”存储。如果它们是以这种格式存储的,那么就数据库而言,它们不是日期(它们是看起来像日期的“字符串”),如果它们是DD/MM/YYYY,您将面临一场噩梦,因为它们的行为与日期不一样

SQL Server中有几种特定的数据类型用于日期/时间信息(datetime,datetime2,smalldatetime,date,time),但所有这些类型都不以人类可读的格式存储数据。相反,它们存储为一组数字,这些数字将以人类可读的方式显示,在您的情况下,默认情况下,您看到的是DD/MM/YYYY格式。中国的用户可能更喜欢在YYYY.MM.DD中查看日期,或在美国将日期视为MM/DD/YYYY。这是可能的,因为在数字显示之前存储的数字上应用了人工格式

所以。在SQL Server中,有一个“安全”日期文字,格式为“YYYYMMDD”,无需转换或强制转换即可使用:

如果您的
[ORDERDATE]
列是日期(或smalldatetime/datetime/datetime2),则这将起作用:

WHERE ORDERDATE BETWEEN '20171017' AND '20171019'
或者,您可以显式地将字符串转换为,但您需要一个“样式号”来显示,以使这些样式完全可靠。例如,样式103用于
DD/MM/YYYY

WHERE ORDERDATE BETWEEN CONVERT(date, '17/10/2017',103) AND CONVERT(date, '19/10/2017',103) 

尽管在上述讨论中使用了“介于之间”,但形成日期范围的更可靠方法是不使用“介于之间”,而是这样做:

WHERE ORDERDATE >= '20171017' AND ORDERDATE < '20171020'
其中ORDERDATE>='20171017'和ORDERDATE<'20171020'

使用此模式(注意,第二天现在是+1),列中存储的日期精度无关紧要。例如,请参见SQL Server日期信息不应以“格式”存储。如果它们是以这种格式存储的,那么就数据库而言,它们不是日期(它们是看起来像日期的“字符串”),如果它们是DD/MM/YYYY,您将面临一场噩梦,因为它们的行为与日期不一样

SQL Server中有几种特定的数据类型用于日期/时间信息(datetime,datetime2,smalldatetime,date,time),但所有这些类型都不以人类可读的格式存储数据。相反,它们存储为一组数字,这些数字将以人类可读的方式显示,在您的情况下,默认情况下,您看到的是DD/MM/YYYY格式。中国的用户可能更喜欢在YYYY.MM.DD中查看日期,或在美国将日期视为MM/DD/YYYY。这是可能的,因为在数字显示之前存储的数字上应用了人工格式

所以。在SQL Server中,有一个“安全”日期文字,格式为“YYYYMMDD”,无需转换或强制转换即可使用:

如果您的
[ORDERDATE]
列是日期(或smalldatetime/datetime/datetime2),则这将起作用:

WHERE ORDERDATE BETWEEN '20171017' AND '20171019'
或者,您可以显式地将字符串转换为,但您需要一个“样式号”来显示,以使这些样式完全可靠。例如,样式103用于
DD/MM/YYYY

WHERE ORDERDATE BETWEEN CONVERT(date, '17/10/2017',103) AND CONVERT(date, '19/10/2017',103) 

尽管在上述讨论中使用了“介于之间”,但形成日期范围的更可靠方法是不使用“介于之间”,而是这样做:

WHERE ORDERDATE >= '20171017' AND ORDERDATE < '20171020'
其中ORDERDATE>='20171017'和ORDERDATE<'20171020'

使用此模式(注意,第二天现在是+1),列中存储的日期精度无关紧要。例如,请参见

您应该将
字符
/
变量字符
输入转换为
日期
,而不是将
日期
转换为
字符