Rob*_*Day 21 sql t-sql sql-server datetime sql-server-2005
有没有办法将DateDiff的DatePart参数作为变量传递?这样我可以编写与此类似的代码?
DECLARE @datePart VARCHAR(2)
DECLARE @dateParameter INT
SELECT @datePart = 'dd'
SELECT @dateParameter = 28
SELECT
*
FROM
MyTable
WHERE
DATEDIFF(@datePart, MyTable.MyDate, GETDATE()) < @dateParameter
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是使用CASE语句检查参数的值,或者将SQL构建为字符串并在EXEC中运行它.
有没有人有任何"更好"的建议?该平台是MS SQL Server 2005
Ask*_*ken 17
虽然旧但但仍然有效.
我是这样做的,只是想分享代码,所以你不必做我必须做的所有烦人的打字.涵盖所有可能的日期部分.只需替换函数的名称和日期函数,以实现其他T-SQL日期函数.
复制和粘贴部分
-- SELECT dbo.fn_DateAddFromStringPart('year', 1, GETDATE())
CREATE FUNCTION fn_DateAddFromStringPart
(
@Interval VARCHAR(11),
@Increment INT,
@Date SMALLDATETIME
)
RETURNS DATETIME
AS
BEGIN
-- Declare the return variable here
DECLARE @NewDate DATETIME
-- Add the T-SQL statements to compute the return value here
SELECT @NewDate = CASE
WHEN @Interval IN ('year', 'yy', 'yyyy') THEN DATEADD(YEAR, @Increment, @Date)
WHEN @Interval IN ('quarter', 'qq', 'q') THEN DATEADD(QUARTER, @Increment, @Date)
WHEN @Interval IN ('month', 'mm', 'm') THEN DATEADD(MONTH, @Increment, @Date)
WHEN @Interval IN ('dayofyear', 'dy', '') THEN DATEADD(DAYOFYEAR, @Increment, @Date)
WHEN @Interval IN ('day', 'dd', 'd') THEN DATEADD(DAY, @Increment, @Date)
WHEN @Interval IN ('week', 'wk', 'ww') THEN DATEADD(WEEK, @Increment, @Date)
WHEN @Interval IN ('weekday', 'dw', 'w') THEN DATEADD(WEEKDAY, @Increment, @Date)
WHEN @Interval IN ('hour', 'hh') THEN DATEADD(HOUR, @Increment, @Date)
WHEN @Interval IN ('minute', 'mi', 'n') THEN DATEADD(MINUTE, @Increment, @Date)
WHEN @Interval IN ('second', 'ss', 's') THEN DATEADD(SECOND, @Increment, @Date)
WHEN @Interval IN ('millisecond', 'ms') THEN DATEADD(MILLISECOND, @Increment, @Date)
WHEN @Interval IN ('microsecond', 'mcs') THEN DATEADD(MICROSECOND, @Increment, @Date)
WHEN @Interval IN ('nanosecond', 'ns') THEN DATEADD(NANOSECOND, @Increment, @Date)
END
-- Return the result of the function
RETURN @NewDate
END
GO
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15919 次 |
最近记录: |