diff --git a/lib/modules/Sql.pmod/mysql.pike b/lib/modules/Sql.pmod/mysql.pike
index 52302d8bea8f1469f409e6f1f9bc7f2689e17338..8b6b999d13068cb359a53ba1eda7c7a21db0eab7 100644
--- a/lib/modules/Sql.pmod/mysql.pike
+++ b/lib/modules/Sql.pmod/mysql.pike
@@ -1,12 +1,12 @@
 /*
- * $Id: mysql.pike,v 1.4 1998/03/20 21:58:23 grubba Exp $
+ * $Id: mysql.pike,v 1.5 1998/07/03 20:03:49 mast Exp $
  *
  * Glue for the Mysql-module
  */
 
 //.
 //. File:	mysql.pike
-//. RCSID:	$Id: mysql.pike,v 1.4 1998/03/20 21:58:23 grubba Exp $
+//. RCSID:	$Id: mysql.pike,v 1.5 1998/07/03 20:03:49 mast Exp $
 //. Author:	Henrik Grubbström (grubba@idonex.se)
 //.
 //. Synopsis:	Implements the glue to the Mysql-module.
@@ -28,3 +28,100 @@ string quote(string s)
 		 ({ "\\", "\"", "\0", "\'", "\n", "\r" }),
 		 ({ "\\\\", "\\\"", "\\0", "\\\'", "\\n", "\\r" })));
 }
+
+// The following time conversion functions assumes the SQL server
+// handles time in this local timezone. They map the special zero
+// time/date spec to 0.
+
+private constant timezone = localtime (0)->timezone;
+
+//. - encode_time
+//.   Converts a system time value to an appropriately formatted time
+//.   spec for the database.
+//. > time - Time to encode.
+//. > date - If nonzero then time is taken as a "full" unix time spec
+//.   (where the date part is ignored), otherwise it's converted as a
+//.   seconds-since-midnight value.
+string encode_time (int time, void|int date)
+{
+  if (date) {
+    if (!time) return "000000";
+    mapping(string:int) ct = localtime (time);
+    return sprintf ("%02d%02d%02d", ct->hour, ct->min, ct->sec);
+  }
+  else return sprintf ("%02d%02d%02d", time / 3600 % 24, time / 60 % 60, time % 60);
+}
+
+//. - encode_date
+//.   Converts a system time value to an appropriately formatted
+//.   date-only spec for the database.
+//. > time - Time to encode.
+string encode_date (int time)
+{
+  if (!time) return "00000000";
+  mapping(string:int) ct = localtime (time);
+  return sprintf ("%04d%02d%02d", ct->year + 1900, ct->mon + 1, ct->mday);
+}
+
+//. - encode_datetime
+//.   Converts a system time value to an appropriately formatted
+//.   date and time spec for the database.
+//. > time - Time to encode.
+string encode_datetime (int time)
+{
+  if (!time) return "00000000000000";
+  mapping(string:int) ct = localtime (time);
+  return sprintf ("%04d%02d%02d%02d%02d%02d",
+		  ct->year + 1900, ct->mon + 1, ct->mday,
+		  ct->hour, ct->min, ct->sec);
+}
+
+//. - decode_time
+//.   Converts a database time spec to a system time value.
+//. > timestr - Time spec to decode.
+//. > date - Take the date part from this system time value. If zero, a
+//.   seconds-since-midnight value is returned.
+int decode_time (string timestr, void|int date)
+{
+  int hour = 0, min = 0, sec = 0;
+  if (sscanf (timestr, "%d:%d:%d", hour, min, sec) <= 1)
+    sscanf (timestr, "%2d%2d%2d", hour, min, sec);
+  if (date && (hour || min || sec)) {
+    mapping(string:int) ct = localtime (date);
+    return mktime (sec, min, hour, ct->mday, ct->mon, ct->year, ct->isdst, ct->timezone);
+  }
+  else return (hour * 60 + min) * 60 + sec;
+}
+
+//. - decode_date
+//.   Converts a database date-only spec to a system time value.
+//.   Assumes 4-digit years.
+//. > datestr - Date spec to decode.
+int decode_date (string datestr)
+{
+  int year = 0, mon = 0, mday = 0, n;
+  n = sscanf (datestr, "%d-%d-%d", year, mon, mday);
+  if (n <= 1) n = sscanf (datestr, "%4d%2d%2d", year, mon, mday);
+  if (year || mon || mday)
+    return mktime (0, 0, 0, n == 3 ? mday : 1, n >= 2 && mon - 1, year - 1900,
+		   -1, timezone);
+  else return 0;
+}
+
+//. - decode_datetime
+//.   Converts a database date and time spec to a system time value.
+//.   Can decode strings missing the time part.
+//. > datestr - Date and time spec to decode.
+int decode_datetime (string timestr)
+{
+  array(string) a = timestr / " ";
+  if (sizeof (a) == 2)
+    return decode_date (a[0]) + decode_time (a[1]);
+  else {
+    int n = sizeof (timestr);
+    if (n >= 12)
+      return decode_date (timestr[..n-7]) + decode_time (timestr[n-6..n-1]);
+    else
+      return decode_date (timestr);
+  }
+}
diff --git a/lib/modules/Sql.pmod/sql.pike b/lib/modules/Sql.pmod/sql.pike
index d1af3f590aeed17c8fcdc9310578f4412a6472da..47d4c19142529b06c87862dee1724f7a92c7e445 100644
--- a/lib/modules/Sql.pmod/sql.pike
+++ b/lib/modules/Sql.pmod/sql.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: sql.pike,v 1.24 1998/07/03 11:42:28 grubba Exp $
+ * $Id: sql.pike,v 1.25 1998/07/03 20:03:51 mast Exp $
  *
  * Implements the generic parts of the SQL-interface
  *
@@ -8,7 +8,7 @@
 
 //.
 //. File:	sql.pike
-//. RCSID:	$Id: sql.pike,v 1.24 1998/07/03 11:42:28 grubba Exp $
+//. RCSID:	$Id: sql.pike,v 1.25 1998/07/03 20:03:51 mast Exp $
 //. Author:	Henrik Grubbström (grubba@idonex.se)
 //.
 //. Synopsis:	Implements the generic parts of the SQL-interface.
@@ -43,6 +43,80 @@ string quote(string s)
   return(replace(s, "\'", "\'\'"));
 }
 
+//. - encode_time
+//.   Converts a system time value to an appropriately formatted time
+//.   spec for the database.
+//. > time - Time to encode.
+//. > date - If nonzero then time is taken as a "full" unix time spec
+//.   (where the date part is ignored), otherwise it's converted as a
+//.   seconds-since-midnight value.
+string encode_time (int time, void|int date)
+{
+  if (functionp (master_sql->encode_time))
+    return master_sql->encode_time (time, date);
+  else
+    throw_error ("sql->encode_time(): Not supported by this database\n");
+}
+
+//. - decode_time
+//.   Converts a database time spec to a system time value.
+//. > timestr - Time spec to decode.
+//. > date - Take the date part from this system time value. If zero, a
+//.   seconds-since-midnight value is returned.
+int decode_time (string timestr, void|int date)
+{
+  if (functionp (master_sql->decode_time))
+    return master_sql->decode_time (timestr, date);
+  else
+    throw_error ("sql->decode_time(): Not supported by this database\n");
+}
+
+//. - encode_date
+//.   Converts a system time value to an appropriately formatted
+//.   date-only spec for the database.
+//. > time - Time to encode.
+string encode_date (int time)
+{
+  if (functionp (master_sql->encode_date))
+    return master_sql->encode_date (time);
+  else
+    throw_error ("sql->encode_date(): Not supported by this database\n");
+}
+
+//. - decode_date
+//.   Converts a database date-only spec to a system time value.
+//. > datestr - Date spec to decode.
+int decode_date (string datestr)
+{
+  if (functionp (master_sql->decode_date))
+    return master_sql->decode_date (datestr);
+  else
+    throw_error ("sql->decode_date(): Not supported by this database\n");
+}
+
+//. - encode_datetime
+//.   Converts a system time value to an appropriately formatted
+//.   date and time spec for the database.
+//. > time - Time to encode.
+string encode_datetime (int time)
+{
+  if (functionp (master_sql->encode_datetime))
+    return master_sql->encode_datetime (time);
+  else
+    throw_error ("sql->encode_datetime(): Not supported by this database\n");
+}
+
+//. - decode_datetime
+//.   Converts a database date and time spec to a system time value.
+//. > datestr - Date and time spec to decode.
+int decode_datetime (string timestr)
+{
+  if (functionp (master_sql->decode_datetime))
+    return master_sql->decode_datetime (timestr);
+  else
+    throw_error ("sql->decode_datetime(): Not supported by this database\n");
+}
+
 //. - create
 //.   Create a new generic SQL object.
 //. > host