我正在使用以下方式比较两个日期:
if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101)
这在今年工作得很好,但是当每年像一个日期一样出现时,它就12/31/2012
不起作用1/1/2013
了。
请帮助我如何解决这个问题。
我正在使用以下方式比较两个日期:
if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101)
这在今年工作得很好,但是当每年像一个日期一样出现时,它就12/31/2012
不起作用1/1/2013
了。
请帮助我如何解决这个问题。
你为什么要比较字符串?你可以比较日期
if @ScheduleDate >= @CurrentDateTime
但如果你的日期包含时间,我通常会
if convert(nvarchar(8), @ScheduleDate, 112) >= convert(nvarchar(8), @CurrentDateTime, 112)
112 日期时间格式为 YYYYMMDD,因此它适用于比较日期
您必须记住,字符串比较是从左到右的,因此“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
请注意,如果变量已经是日期时间,则无需转换它们。
假设这两个变量当前都是 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
当您使用 CONVERT(nvarchar(8), @ScheduleDate, 112) 函数时,它会返回字符串而不是日期。
因此,在 Sql Server 中使用“112”DateFormat 它以“YMD”格式返回字符串,没有任何分隔。在您的查询中比较该字符串并获得期望的输出。
如“如果 CONVERT(nvarchar(8), @ScheduleDate, 112) >= CONVERT(nvarchar(8), @CurrentDateTime, 112)”
我不会使用 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 值是否在同一个日期(忽略时间分量),上面的版本已经证明是有效的。
日期:从和到,格式如下
在 SQL 语句中,a.DateCreated >= CAST ('#from_date#' AS DATE) 和 a.DateCreated <= CAST('#to_date#' AS DATE)
在没有任何原始日期时间列的情况下工作正常