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

Sql server 如何解决SQL Server中的日期比较问题?,sql-server,sql-server-2008,date,comparison,Sql Server,Sql Server 2008,Date,Comparison,我使用以下方法比较两个日期: if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101) 这在本年度内运行良好,但当每年的日期为2012年12月31日和2013年1月1日时,则不起作用 请帮助我如何解决这个问题。您必须记住字符串比较是从左到右的,所以1/。。。。小于12/ 您需要使用日期时间比较,而不是字符串比较 差不多 DECLARE @ScheduleDate D

我使用以下方法比较两个日期:

if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101)
这在本年度内运行良好,但当每年的日期为2012年12月31日和2013年1月1日时,则不起作用


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

您必须记住字符串比较是从左到右的,所以1/。。。。小于12/

您需要使用日期时间比较,而不是字符串比较

差不多

DECLARE @ScheduleDate DATETIME = '1/1/2013',
        @CurrentDateTime DATETIME = '12/31/2012'

IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
    SELECT @ScheduleDate, @CurrentDateTime
END

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)
END

请注意,如果变量已经是日期时间,则不需要转换它们。

您必须记住字符串比较是从左到右的,因此1/。。。。小于12/

您需要使用日期时间比较,而不是字符串比较

差不多

DECLARE @ScheduleDate DATETIME = '1/1/2013',
        @CurrentDateTime DATETIME = '12/31/2012'

IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
    SELECT @ScheduleDate, @CurrentDateTime
END

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)
END

请注意,如果变量已经是日期时间,则不需要转换它们。

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

if @ScheduleDate >= @CurrentDateTime
但如果你的约会有时间,我通常会

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

112 datetime格式是YYYYMMDD,因此它适合于比较日期

为什么要比较字符串?
if @ScheduleDate >= @CurrentDateTime
你可以比较日期

if @ScheduleDate >= @CurrentDateTime
但如果你的约会有时间,我通常会

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

112 datetime格式为YYYYMMDD,因此比较日期很好

假设两个变量当前都是datetime变量,您不能只比较它们而不转换为字符串吗

if @ScheduleDate >= @CurrentDateTime
declare @ScheduleDate DATETIME, @CurrentDateTime DATETIME


SET @ScheduleDate = '1 Jan 2013'
SET @CurrentDateTime = GetDate()

IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
    SELECT 'Do Something'
END
ELSE
BEGIN
    SELECT 'Do Something Else'
END

假设这两个变量当前都是DateTime变量,您不能在不转换为字符串的情况下对它们进行比较吗

declare @ScheduleDate DATETIME, @CurrentDateTime DATETIME


SET @ScheduleDate = '1 Jan 2013'
SET @CurrentDateTime = GetDate()

IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
    SELECT 'Do Something'
END
ELSE
BEGIN
    SELECT 'Do Something Else'
END

当您使用convertnvar8、@ScheduleDate、112函数时,它是返回字符串,而不是日期

所以, 在Sql Server中使用112 DateFormat,它的返回字符串为YMD格式,不带任何分隔符。 在查询中比较该字符串并获得所需的输出


例如,如果CONVERTnvarchar8、@ScheduleDate,112>=CONVERTnvarchar8、@CurrentDateTime,112

当您使用convertNVarhar8、@ScheduleDate,112函数时,它是返回字符串而不是日期

所以, 在Sql Server中使用112 DateFormat,它的返回字符串为YMD格式,不带任何分隔符。 在查询中比较该字符串并获得所需的输出


例如,如果CONVERTnvarchar8、@ScheduleDate、112>=CONVERTnvarchar8、@CurrentDateTime、112

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

我使用2008版之前的SQL自定义项

CREATE  FUNCTION [dbo].[DateOnly] (@Date DateTime)  
RETURNS Datetime AS  
BEGIN 
  Return cast (floor (cast (@Date as float)) as DateTime)
END
对于>=2008的版本,此方法

挑选convert@MyDateTime截止日期


当然,您可以直接比较日期时间值,但要知道两个日期时间值是否在同一日期,忽略时间组件,以上版本已被证明是有效的。

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

我使用2008版之前的SQL自定义项

CREATE  FUNCTION [dbo].[DateOnly] (@Date DateTime)  
RETURNS Datetime AS  
BEGIN 
  Return cast (floor (cast (@Date as float)) as DateTime)
END
对于>=2008的版本,此方法

挑选convert@MyDateTime截止日期


当然,您可以直接比较日期时间值,但要知道两个日期时间值是否在同一日期,忽略时间组件,以上版本已被证明是有效的。

date:From和to,格式如下

from_Date=dateformatform.from,mm/dd/yyyy 截止日期=dateformatnow+1,mm/dd/yyyy 在SQL语句中
其中a.DateCreated>=将“from_date”转换为日期,a.DateCreateddate:from和To,格式如下

from_Date=dateformatform.from,mm/dd/yyyy 截止日期=dateformatnow+1,mm/dd/yyyy 在SQL语句中
如果a.DateCreated>=将“from_date”转换为date和a.DateCreated,那么如果变量已经是DateTime,是否有理由将其转换为DateTime?@Greg,没有,我刚刚将其添加到了答案中。我只按此比较了日期。。。如果我要转换为datetime,它需要时间将其转换为日期数据类型,而不是如果变量已经是datetime,那么有没有理由将其转换为datetime?@Greg,没有,我刚刚将其添加到了答案中。我只按此比较了日期。。。如果我转换为datetime,则需要时间将其转换为日期数据类型,而不是将datetime转换为日期。。。。。如果CAST@ScheduleDate截止日期>=CAST@CurrentDateTime作为日期…或仅将日期时间转换为日期。。。。。如果CAST@ScheduleDate截止日期>=CAST@CurrentDateTime截止日期。。。。。