Sql server SQL Server-在类型为DD/MM/YYYY的两个日期之间选择
我想使用以DD/MM/YYYY格式提供的日期范围查询datetime字段 我知道要将datetime转换为我可以使用的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),
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),列中存储的日期精度无关紧要。例如,请参见您应该将
字符
/变量字符
输入转换为日期
,而不是将日期
转换为字符