1

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

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

这在今年工作得很好,但是当每年像一个日期一样出现时,它就12/31/2012不起作用1/1/2013了。

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

4

6 回答 6

5

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

if @ScheduleDate >= @CurrentDateTime

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

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

112 日期时间格式为 YYYYMMDD,因此它适用于比较日期

于 2012-11-26T05:48:44.587 回答
2

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

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

就像是

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

SQL 小提琴演示

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

于 2012-11-26T05:46:34.900 回答
1

假设这两个变量当前都是 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
于 2012-11-26T05:48:54.367 回答
0

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

因此,在 Sql Server 中使用“112”DateFormat 它以“YMD”格式返回字符串,没有任何分隔。在您的查询中比较该字符串并获得期望的输出。

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

于 2012-11-26T06:31:13.370 回答
0

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

我对 2008 版之前的 SQL 使用 UDF

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

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

选择转换(@MyDateTime 作为日期)

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

于 2012-11-26T06:44:25.267 回答
0

日期:从和到,格式如下

from_Date# = #dateformat("#form.from#", "mm/dd/yyyy")

to_Date# = #dateformat("#now()#" + 1, "mm/dd/yyyy")

在 SQL 语句中,a.DateCreated >= CAST ('#from_date#' AS DATE) 和 a.DateCreated <= CAST('#to_date#' AS DATE)

在没有任何原始日期时间列的情况下工作正常

于 2015-08-20T17:50:01.243 回答