如何解决SQL Server中的日期比较问题?

1 人关注

我正在使用以下方式来比较两个日期。

if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101)

这对当年的工作很好,但当每年的日期是12/31/20121/1/2013时,它就不工作了。

请帮助我,我如何才能解决这个问题。

sql-server
sql-server-2008
date
comparison
Ram Singh
Ram Singh
发布于 2012-11-26
6 个回答
Roman Pekar
Roman Pekar
发布于 2020-06-20
已采纳
0 人赞同

你为什么要比较字符串? 你可以比较日期

if @ScheduleDate >= @CurrentDateTime

但如果你的日期包含时间,我通常会这样做

if convert(nvarchar(8), @ScheduleDate, 112) >= convert(nvarchar(8), @CurrentDateTime, 112)

112日期格式是YYYMMDD,所以它适合于比较日期。

或者直接将 DATETIME 转换为 DATE ..... IF CAST(@ScheduleDate AS DATE) >= CAST(@CurrentDateTime AS DATE) .....
Adriaan Stander
Adriaan Stander
发布于 2020-06-20
0 人赞同

你必须记住,字符串的比较是从左到右,所以 "1/.... "比 "12/... "要小。

你需要使用DATETIME比较,而不是字符串比较。

类似的情况

DECLARE @ScheduleDate DATETIME = '1/1/2013',
        @CurrentDateTime DATETIME = '12/31/2012'
IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
SELECT @ScheduleDate, @CurrentDateTime
DECLARE @ScheduleDateString VARCHAR(20) = '1/1/2013',
        @CurrentDateTimeString VARCHAR(20) = '12/31/2012'
IF (CONVERT(DATETIME,@ScheduleDateString,101)>=CONVERT(DATETIME,@CurrentDateTimeString,101))
BEGIN
SELECT CONVERT(DATETIME,@ScheduleDateString,101),CONVERT(DATETIME,@CurrentDateTimeString,101)

SQL Fiddle DEMO

请注意,如果变量已经是数据时间,你就不需要转换它们。

Greg
如果变量已经是DateTime,是否有任何理由将其转换为DateTime?
@Greg,不,我刚刚在答案中加入了这一点。
我只用它来比较日期......如果我转换为日期时间,也要花时间。
Greg
Greg
发布于 2020-06-20
0 人赞同

假设两个变量目前都是DateTime变量,难道就不能不转换为字符串而直接比较吗?

declare @ScheduleDate DATETIME, @CurrentDateTime DATETIME
SET @ScheduleDate = '1 Jan 2013'
SET @CurrentDateTime = GetDate()
IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
SELECT 'Do Something'
BEGIN
SELECT 'Do Something Else'
Deniyal Tandel
Deniyal Tandel
发布于 2020-06-20
0 人赞同

当你使用CONVERT(nvarchar(8), @ScheduleDate, 112)函数时,返回的是字符串而不是日期。

在Sql Server中使用 "112 "DateFormat,它的返回字符串是 "YMD "格式,没有任何分隔。 在你的查询中比较这个字符串,并得到想要的输出。

如 "如果 CONVERT(nvarchar(8), @ScheduleDate, 112) >= CONVERT(nvarchar(8), @CurrentDateTime, 112)"

alzaimar
alzaimar
发布于 2020-06-20
0 人赞同

我不会使用CONVERT来比较格式化的字符串。它很慢(好吧,更像是微秒,但仍然)。

我使用2008版之前的SQL的UDF

CREATE FUNCTION [dbo].[DateOnly] (@Date DateTime)  
RETURNS Datetime AS
BEGIN
Return cast (floor (cast (@Date as float)) as DateTime)

而对于>=2008的版本,这种方法

select convert(@MyDateTime as DATE)

当然,你可以直接比较数据时间值,但要知道两个数据时间值是否在同一日期(忽略时间成分),上述版本已被证明是有效的。

malinda sanjaka
malinda sanjaka
发布于 2020-06-20
0 人赞同

日期:发件人和收件人,格式如下