Mysql 获取当前月份和日期的最佳方法,但使用静态年份

Mysql 获取当前月份和日期的最佳方法,但使用静态年份,mysql,sql,Mysql,Sql,我有一个存储“开始”和“结束”日期的表格,以及其他各行,例如: s_d=2000-01-01 e_d=2000-05-17 我想根据当前日期是否在开始日期和结束日期之间或在开始日期和结束日期之间从表中提取一些行,但我似乎无法使其工作 我使用静态年份(2000年),因为我真的不知道如何仅使用月份和日期来比较日期 $q = "SELECT xxx, yyy, c_d, e_d, DATE('2000-'.DATE('m').'-'.DATE('d'

我有一个存储“开始”和“结束”日期的表格,以及其他各行,例如:

s_d=2000-01-01

e_d=2000-05-17

我想根据当前日期是否在开始日期和结束日期之间或在开始日期和结束日期之间从表中提取一些行,但我似乎无法使其工作

我使用静态年份(2000年),因为我真的不知道如何仅使用月份和日期来比较日期

$q = "SELECT 
    xxx, 
    yyy,    
    c_d,
    e_d,
    DATE('2000-'.DATE('m').'-'.DATE('d')) AS c_d
    FROM mytable
    WHERE c_d >= s_d AND c_d <= e_d";
$q=“选择
xxx,
yyy,
库德,
e_d,
日期('2000-'。日期('m')。-'日期('d'))作为c_d
从mytable
其中c_d>=s_d,c_d=DATE_格式(s_d,“%Y-%m-%d”)

和DATE_格式(CONCAT('2000','-',MONTH(NOW()),'-',DAY(NOW()),'%Y-%m-%d')在一般情况下,比较两个可能跨越年份边界的日期时,您的代码应该可以工作。或者您可以使用

将@d声明为datetime=GETDATE();//SQL Server

$q = "SELECT 
    xxx, 
    yyy,    
    c_d,
    e_d,
    DATE('2000-'.DATE('m').'-'.DATE('d')) AS c_d
    FROM mytable
    WHERE @d BETWEEN c_d >= s_d AND c_d <= e_d";
select Date, TotalAllowance from Calculation where EmployeeId = 1
                 and Date between s_d and e_d
对于其他版本的SQL


如果要忽略年,请使用月(@d)和日(@d)

一个问题是SQL字符串无效

如果您打算使用PHP DATE函数返回两位数的月份和两位数的日期,作为SQL文本中的文本,那么这些需要作为PHP字符串的一部分进行计算,而不是作为SQL文本的一部分传递给MySQL

也就是说,您的PHP代码可能如下所示:

 $sql="SELECT ... 
            , DATE('2000-" . DATE('m') . "-" . DATE('d') . "') AS c_d
            , ...
         FROM ... 
        WHERE ... ";
       SELECT ... 
            , DATE('2000-08-24') AS c_d
            , ...
         FROM ... 
        WHERE ... "
当PHP计算表达式以向$sql变量赋值时,字符串将包含如下内容:

 $sql="SELECT ... 
            , DATE('2000-" . DATE('m') . "-" . DATE('d') . "') AS c_d
            , ...
         FROM ... 
        WHERE ... ";
       SELECT ... 
            , DATE('2000-08-24') AS c_d
            , ...
         FROM ... 
        WHERE ... "
而这在成为有效的MySQL语法方面有更好的机会


此外,在SELECT列表中引用(在WHERE子句中)分配给该表达式的别名也是无效的

就比较日期值的月和日部分而言,这有点棘手

您的条件与开始日期为“2015-12-25”和结束日期为“2016-01-15”的行不匹配

对于MySQL,您可以使用DATE_FORMAT函数只返回月份和日期

 SELECT t.s_d
      , DATE_FORMAT(t.s_d,'%m%d') AS s_mmdd
      , t.e_d
      , DATE_FORMAT(t.e_d,'%m%d') AS e_mmdd
这些表达式可以在WHERE子句中使用

 WHERE DATE_FORMAT(t.s_d,'%m%d') <= '0824'
   AND DATE_FORMAT(t.e_d,'%m%d') >= '0824'
WHERE DATE_格式(t.s_d,'%m%d')='0824'
请注意,这将迫使MySQL为表中的每一行计算这些表达式。要获得范围扫描的可能性,您可以将s_d和e_d“规范化”为静态年,并将其存储为列。或者只将月和日作为字符串存储在规范化的“s_mmdd”和“e_mmdd”列中

同样,只有当开始日期的mmdd低于结束日期的mmdd时,这才有效。(我前面提到的问题,日期范围跨越了一年边界。)


要获取这些行上的匹配项,您需要识别它们,然后在范围检查中“翻转”大于/小于条件。(或者在检查中为这些行交换s_mmdd和e_mmdd。)

这是MySQL、SQL Server、PostgreSQL吗?请添加与您使用的DBMS对应的标记。
DATE('m')是什么
应该怎么做?我认为您使用这些函数时没有使用。而且MySQL不与
连接。您必须使用
CONCAT()
函数。